From e197ebeb49de5acc8b2eefc1170c5d3c0a3be317 Mon Sep 17 00:00:00 2001 From: Ibrahim Date: Mon, 15 Nov 2021 18:29:08 +0800 Subject: [PATCH 1/9] 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 From acbcd8050e3a94020e08af782ff538e27c3e3529 Mon Sep 17 00:00:00 2001 From: faris Date: Mon, 15 Nov 2021 19:24:12 +0800 Subject: [PATCH 2/9] test --- contracts/mainnet/connectors/universeFinance/main.sol | 1 - 1 file changed, 1 deletion(-) diff --git a/contracts/mainnet/connectors/universeFinance/main.sol b/contracts/mainnet/connectors/universeFinance/main.sol index 1a9af47b..503005d9 100644 --- a/contracts/mainnet/connectors/universeFinance/main.sol +++ b/contracts/mainnet/connectors/universeFinance/main.sol @@ -52,7 +52,6 @@ abstract contract UniverseFinanceResolver is Helpers, Events { } contract ConnectV2UniverseFinance is UniverseFinanceResolver { - string public constant name = "UniverseFinance-v1"; } \ No newline at end of file From f27adab10eae35f949bc24d4ce1200adda85ab14 Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Tue, 23 Nov 2021 19:51:12 +0800 Subject: [PATCH 3/9] Update helpers.sol --- contracts/mainnet/connectors/universeFinance/helpers.sol | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/contracts/mainnet/connectors/universeFinance/helpers.sol b/contracts/mainnet/connectors/universeFinance/helpers.sol index 03330b04..02161e7f 100644 --- a/contracts/mainnet/connectors/universeFinance/helpers.sol +++ b/contracts/mainnet/connectors/universeFinance/helpers.sol @@ -8,8 +8,7 @@ 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); + IUniverseAdapter constant universeAdapter = IUniverseAdapter(0x876861Ad49f911442720cF97c9b3fCe4070F07d5); function _deposit( address universeVault, @@ -25,7 +24,7 @@ abstract contract Helpers is DSMath, Basic { uint256 share1 ) internal returns(uint256, uint256){ require(share0 > 0 || share1 > 0, "ZERO"); - return IUniverseVaultV3(universeVault).withdraw(share0, share1); + return IVaultV3(universeVault).withdraw(share0, share1); } } From 13e1ec20b48f4511afffff5c5641cd1299a0b11d Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Tue, 23 Nov 2021 19:51:39 +0800 Subject: [PATCH 4/9] Update interface.sol --- contracts/mainnet/connectors/universeFinance/interface.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/mainnet/connectors/universeFinance/interface.sol b/contracts/mainnet/connectors/universeFinance/interface.sol index 6cea8e7a..3ccafdf0 100644 --- a/contracts/mainnet/connectors/universeFinance/interface.sol +++ b/contracts/mainnet/connectors/universeFinance/interface.sol @@ -11,7 +11,7 @@ interface IUniverseAdapter { } -interface IUniverseVaultV3 { +interface IVaultV3 { function withdraw(uint256 share0, uint256 share1) external returns(uint256, uint256); } From e0322afab740448240da1a063c403f2e755249e0 Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Tue, 23 Nov 2021 19:52:05 +0800 Subject: [PATCH 5/9] Update main.sol --- contracts/mainnet/connectors/universeFinance/main.sol | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/contracts/mainnet/connectors/universeFinance/main.sol b/contracts/mainnet/connectors/universeFinance/main.sol index 503005d9..2740b336 100644 --- a/contracts/mainnet/connectors/universeFinance/main.sol +++ b/contracts/mainnet/connectors/universeFinance/main.sol @@ -5,7 +5,7 @@ import {TokenInterface} from "../../common/interfaces.sol"; import {Helpers} from "./helpers.sol"; import {Events} from "./events.sol"; -abstract contract UniverseFinanceResolver is Helpers, Events { +abstract contract UniverseFinanceConnect is Helpers, Events { /** * @notice Deposit in Universe Vault by Adapter @@ -51,7 +51,6 @@ abstract contract UniverseFinanceResolver is Helpers, Events { } -contract ConnectV2UniverseFinance is UniverseFinanceResolver { +contract ConnectV2UniverseFinance is UniverseFinanceConnect { string public constant name = "UniverseFinance-v1"; - -} \ No newline at end of file +} From 5c0dd54f24ab7f630616e6ebbb1576530a800841 Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Thu, 25 Nov 2021 13:20:41 +0800 Subject: [PATCH 6/9] Update helpers.sol add approve --- .../mainnet/connectors/universeFinance/helpers.sol | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/contracts/mainnet/connectors/universeFinance/helpers.sol b/contracts/mainnet/connectors/universeFinance/helpers.sol index 02161e7f..e9a9c6cc 100644 --- a/contracts/mainnet/connectors/universeFinance/helpers.sol +++ b/contracts/mainnet/connectors/universeFinance/helpers.sol @@ -27,4 +27,17 @@ abstract contract Helpers is DSMath, Basic { return IVaultV3(universeVault).withdraw(share0, share1); } + function _approve(address universeVault, uint256 amount0, uint256 amount1) internal { + IVaultV3 universe = IVaultV3(universeVault); + TokenInterface token; + if (amount0 > 0) { + token = universe.token0(); + token.approve(address(universeAdapter), amount0); + } + if (amount1 > 0) { + token = universe.token1(); + token.approve(address(universeAdapter), amount1); + } + } + } From fcec1b0dbe0dbd872651011894cfa1f690f4c970 Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Thu, 25 Nov 2021 13:21:25 +0800 Subject: [PATCH 7/9] Update interface.sol --- contracts/mainnet/connectors/universeFinance/interface.sol | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/contracts/mainnet/connectors/universeFinance/interface.sol b/contracts/mainnet/connectors/universeFinance/interface.sol index 3ccafdf0..cfc8ab8c 100644 --- a/contracts/mainnet/connectors/universeFinance/interface.sol +++ b/contracts/mainnet/connectors/universeFinance/interface.sol @@ -1,4 +1,7 @@ pragma solidity ^0.7.6; + +import "../../common/interfaces.sol"; + pragma abicoder v2; interface IUniverseAdapter { @@ -13,5 +16,9 @@ interface IUniverseAdapter { interface IVaultV3 { + function token0() external returns(TokenInterface); + + function token1() external returns(TokenInterface); + function withdraw(uint256 share0, uint256 share1) external returns(uint256, uint256); } From 416c632adc0de221e7fba450c4b46456008f4f05 Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Thu, 25 Nov 2021 13:22:10 +0800 Subject: [PATCH 8/9] Update main.sol approve --- contracts/mainnet/connectors/universeFinance/main.sol | 1 + 1 file changed, 1 insertion(+) diff --git a/contracts/mainnet/connectors/universeFinance/main.sol b/contracts/mainnet/connectors/universeFinance/main.sol index 2740b336..bd4e43e4 100644 --- a/contracts/mainnet/connectors/universeFinance/main.sol +++ b/contracts/mainnet/connectors/universeFinance/main.sol @@ -22,6 +22,7 @@ abstract contract UniverseFinanceConnect is Helpers, Events { ) external returns (string memory _eventName, bytes memory _eventParam){ amountA = getUint(getIds[0], amountA); amountB = getUint(getIds[1], amountB); + _approve(universeVault, amountA, amountB); (uint256 share0, uint256 share1) = _deposit(universeVault, amountA, amountB); // EVENT _eventName = "LogDeposit(address,uint256,uint256,uint256,uint256)"; From f6959f915942167c02d281265fd9d49793d34e37 Mon Sep 17 00:00:00 2001 From: UniverseFinance <87629076+UniverseFinance@users.noreply.github.com> Date: Sat, 27 Nov 2021 22:29:23 +0800 Subject: [PATCH 9/9] add getIds and setIds --- contracts/mainnet/connectors/universeFinance/main.sol | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/contracts/mainnet/connectors/universeFinance/main.sol b/contracts/mainnet/connectors/universeFinance/main.sol index bd4e43e4..ac9da2ef 100644 --- a/contracts/mainnet/connectors/universeFinance/main.sol +++ b/contracts/mainnet/connectors/universeFinance/main.sol @@ -18,12 +18,15 @@ abstract contract UniverseFinanceConnect is Helpers, Events { address universeVault, uint256 amountA, uint256 amountB, - uint256[] calldata getIds + uint256[] calldata getIds, + uint256[] calldata setIds ) external returns (string memory _eventName, bytes memory _eventParam){ amountA = getUint(getIds[0], amountA); amountB = getUint(getIds[1], amountB); _approve(universeVault, amountA, amountB); (uint256 share0, uint256 share1) = _deposit(universeVault, amountA, amountB); + setUint(setIds[0], share0); + setUint(setIds[1], share1); // EVENT _eventName = "LogDeposit(address,uint256,uint256,uint256,uint256)"; _eventParam = abi.encode(universeVault, amountA, amountB, share0, share1); @@ -40,8 +43,11 @@ abstract contract UniverseFinanceConnect is Helpers, Events { address universeVault, uint256 share0, uint256 share1, + uint256[] calldata getIds, uint256[] calldata setIds ) external returns (string memory _eventName, bytes memory _eventParam){ + share0 = getUint(getIds[0], share0); + share1 = getUint(getIds[1], share1); (uint256 _amtA, uint256 _amtB) = _withdraw(universeVault, share0, share1); setUint(setIds[0], _amtA); setUint(setIds[1], _amtB);