From 1bfd45527e447e149bd7e37891dc61a9773a8cd7 Mon Sep 17 00:00:00 2001 From: Shriya Tyagi Date: Wed, 12 Oct 2022 06:27:45 +0400 Subject: [PATCH] Morpho-Aave contracts set up --- .../{morpho => morpho-aave}/events.sol | 13 +- .../{morpho => morpho-aave}/helpers.sol | 8 +- .../connectors/morpho-aave/interface.sol | 55 +++++ .../mainnet/connectors/morpho-aave/main.sol | 222 ++++++++++++++++++ .../mainnet/connectors/morpho/interface.sol | 42 ---- contracts/mainnet/connectors/morpho/main.sol | 176 -------------- 6 files changed, 281 insertions(+), 235 deletions(-) rename contracts/mainnet/connectors/{morpho => morpho-aave}/events.sol (72%) rename contracts/mainnet/connectors/{morpho => morpho-aave}/helpers.sol (71%) create mode 100644 contracts/mainnet/connectors/morpho-aave/interface.sol create mode 100644 contracts/mainnet/connectors/morpho-aave/main.sol delete mode 100644 contracts/mainnet/connectors/morpho/interface.sol delete mode 100644 contracts/mainnet/connectors/morpho/main.sol diff --git a/contracts/mainnet/connectors/morpho/events.sol b/contracts/mainnet/connectors/morpho-aave/events.sol similarity index 72% rename from contracts/mainnet/connectors/morpho/events.sol rename to contracts/mainnet/connectors/morpho-aave/events.sol index f8f29f7b..47779061 100644 --- a/contracts/mainnet/connectors/morpho/events.sol +++ b/contracts/mainnet/connectors/morpho-aave/events.sol @@ -4,26 +4,22 @@ pragma experimental ABIEncoderV2; contract Events { event LogDeposit( - uint256 pool, address tokenAddress, address poolTokenAddress, uint256 amount, - uint256 maxGasForMatching, uint256 getId, uint256 setId ); event LogBorrow( - uint256 pool, + bool isETH, address poolTokenAddress, uint256 amount, - uint256 maxGasForMatching, uint256 getId, uint256 setId ); event LogWithdraw( - uint256 pool, bool isETH, address poolTokenAddress, uint256 amt, @@ -32,7 +28,6 @@ contract Events { ); event LogPayback( - uint256 pool, bool isETH, address poolTokenAddress, uint256 amt, @@ -40,9 +35,5 @@ contract Events { uint256 setId ); - event LogClaimed( - uint256 pool, - address[] tokenAddresses, - bool tradeForMorphoToken - ); + event LogClaimed(address[] tokenAddresses, bool tradeForMorphoToken); } diff --git a/contracts/mainnet/connectors/morpho/helpers.sol b/contracts/mainnet/connectors/morpho-aave/helpers.sol similarity index 71% rename from contracts/mainnet/connectors/morpho/helpers.sol rename to contracts/mainnet/connectors/morpho-aave/helpers.sol index d99da296..3d558573 100644 --- a/contracts/mainnet/connectors/morpho/helpers.sol +++ b/contracts/mainnet/connectors/morpho-aave/helpers.sol @@ -7,13 +7,9 @@ import "../../common/basic.sol"; import "../../common/interfaces.sol"; abstract contract Helpers is Stores, Basic { - IMorphoCore public constant morphoCompound = - IMorphoCore(0x8888882f8f843896699869179fB6E4f7e3B58888); IMorphoCore public constant morphoAave = IMorphoCore(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0); - enum Underlying { - AAVEV2, - COMPOUNDV2 - } + IMorphoAaveLens public constant morphoAaveLens = + IMorphoAaveLens(0x507fA343d0A90786d86C7cd885f5C49263A91FF4); } diff --git a/contracts/mainnet/connectors/morpho-aave/interface.sol b/contracts/mainnet/connectors/morpho-aave/interface.sol new file mode 100644 index 00000000..fde267ca --- /dev/null +++ b/contracts/mainnet/connectors/morpho-aave/interface.sol @@ -0,0 +1,55 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; + +interface IMorphoCore { + function supply( + address _poolTokenAddress, + address _onBehalf, + uint256 _amount + ) external; + + function borrow(address _poolTokenAddress, uint256 _amount) external; + + function withdraw(address _poolTokenAddress, uint256 _amount) external; + + function repay( + address _poolTokenAddress, + address _onBehalf, + uint256 _amount + ) external; + + function liquidate( + address _poolTokenBorrowedAddress, + address _poolTokenCollateralAddress, + address _borrower, + uint256 _amount + ) external; + + function claimRewards( + address[] calldata _tokenAddresses, + bool _tradeForMorphoToken + ) external; +} + +interface IMorphoAaveLens { + function _getCurrentBorrowBalanceInOf(address _poolToken, address _user) + external + view + returns ( + address underlyingToken, + uint256 balanceInP2P, + uint256 balanceOnPool, + uint256 totalBalance + ); + + function _getCurrentSupplyBalanceInOf(address _poolToken, address _user) + external + view + returns ( + address underlyingToken, + uint256 balanceInP2P, + uint256 balanceOnPool, + uint256 totalBalance + ); +} diff --git a/contracts/mainnet/connectors/morpho-aave/main.sol b/contracts/mainnet/connectors/morpho-aave/main.sol new file mode 100644 index 00000000..c3ef1501 --- /dev/null +++ b/contracts/mainnet/connectors/morpho-aave/main.sol @@ -0,0 +1,222 @@ +//SPDX-License-Identifier: MIT +pragma solidity ^0.7.0; +pragma experimental ABIEncoderV2; +import "./helpers.sol"; +import "./events.sol"; + +abstract contract MorphoAave is Helpers, Events { + /** + * @dev Deposit ETH/ERC20_Token. + * @notice Deposit a token to Morpho Aave for lending / collaterization. + * @param _tokenAddress The address of underlying token to deposit.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _poolTokenAddress The address of aToken to deposit.(For ETH: aWETH address) + * @param _amount The amount of the token (in underlying) to deposit. (For max: `uint256(-1)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function deposit( + address _tokenAddress, + address _poolTokenAddress, + uint256 _amount, + // uint256 _maxGasForMatching, // optional + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _amount); + + bool _isETH = _tokenAddress == ethAddr; + + TokenInterface _tokenContract = _isETH + ? TokenInterface(wethAddr) + : TokenInterface(_tokenAddress); + + if (_amt == uint256(-1)) { + _amt = _isETH + ? address(this).balance + : _tokenContract.balanceOf(address(this)); + } + + if (_isETH) convertEthToWeth(_isETH, _tokenContract, _amt); + + approve(_tokenContract, address(morphoAave), _amt); + + morphoAave.supply(_poolTokenAddress, address(this), _amt); + + setUint(_setId, _amt); + + _eventName = "LogDeposit(address,address,uint256,uint256,uint256)"; + _eventParam = abi.encode( + _tokenAddress, + _poolTokenAddress, + _amt, + // _maxGasForMatching, + _getId, + _setId + ); + } + + /** + * @dev Borrow ETH/ERC20_Token. + * @notice Borrow a token from Morpho Aave. + * @param _tokenAddress The address of underlying token to borrow.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _poolTokenAddress The address of aToken to borrow.(For ETH: aWETH address) + * @param _amount The amount of the token (in underlying) to borrow. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens borrowed. + */ + function borrow( + address _tokenAddress, + address _poolTokenAddress, + uint256 _amount, + // uint256 _maxGasForMatching, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _amount); + + bool _isETH = _tokenAddress == ethAddr; + + morphoAave.borrow(_poolTokenAddress, _amt); + + if (_isETH) convertWethToEth(_isETH, TokenInterface(wethAddr), _amt); + + setUint(_setId, _amt); + + _eventName = "LogBorrow(bool,address,uint256,uint256,uint256)"; + _eventParam = abi.encode( + _isETH, + _poolTokenAddress, + _amt, + // _maxGasForMatching, + _getId, + _setId + ); + } + + /** + * @dev Withdraw ETH/ERC20_Token. + * @notice Withdraw a token from Morpho Aave. + * @param _tokenAddress The address of underlying token to withdraw.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _poolTokenAddress The address of aToken to withdraw.(For ETH: aWETH address) + * @param _amount The amount of the token (in underlying) to withdraw. (For max: `uint256(-1)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens withdrawed. + */ + function withdraw( + address _tokenAddress, + address _poolTokenAddress, + uint256 _amount, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _amount); + bool _isETH = _tokenAddress == ethAddr; + address _token = _isETH ? wethAddr : _tokenAddress; + + if (_amt == uint256(-1)) + (, , , _amt) = morphoAaveLens._getCurrentSupplyBalanceInOf( + _poolTokenAddress, + address(this) + ); + + morphoAave.withdraw(_poolTokenAddress, _amt); + + convertWethToEth(_isETH, TokenInterface(_token), _amt); + + setUint(_setId, _amt); + + _eventName = "LogWithdraw(bool,address,uint256,uint256,uint256)"; + _eventParam = abi.encode( + _isETH, + _poolTokenAddress, + _amt, + _getId, + _setId + ); + } + + /** + * @dev Payback ETH/ERC20_Token. + * @notice Payback a token to Morpho Aave. + * @param _tokenAddress The address of underlying token to payback.(For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _poolTokenAddress The address of aToken to payback.(For ETH: aWETH address) + * @param _amount The amount of the token (in underlying) to payback. (For max: `uint256(-1)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens paid back. + */ + function payback( + address _tokenAddress, + address _poolTokenAddress, + uint256 _amount, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + bool _isETH = _tokenAddress == ethAddr; + uint256 _amt = getUint(_getId, _amount); + address _token = _isETH ? wethAddr : _tokenAddress; + + if (_amt == uint256(-1)) { + (, , , _amt) = morphoAaveLens._getCurrentBorrowBalanceInOf( + _poolTokenAddress, + address(this) + ); + } + + if (_isETH) convertEthToWeth(_isETH, TokenInterface(_token), _amt); + + approve(TokenInterface(_token), address(morphoAave), _amt); + + morphoAave.repay(_poolTokenAddress, address(this), _amt); + + setUint(_setId, _amt); + + _eventName = "LogPayback(bool,address,uint256,uint256,uint256)"; + _eventParam = abi.encode( + _isETH, + _poolTokenAddress, + _amt, + _getId, + _setId + ); + } + + /** + * @dev Claim rewards. + * @notice Claim rewards for the given assets from underlying protocol. + * @param _poolTokenAddresses The assets to claim rewards from (aToken or variable debt token).(For ETH: aToken or variable debt token address of WETH) + * @param _tradeForMorphoToken Whether or not to trade reward tokens for MORPHO tokens. + */ + function claim( + address[] calldata _poolTokenAddresses, //todo: eth will be claimed as weth currently? + bool _tradeForMorphoToken + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + morphoAave.claimRewards(_poolTokenAddresses, _tradeForMorphoToken); + + _eventName = "LogClaimed(address[],bool)"; + _eventParam = abi.encode(_poolTokenAddresses, _tradeForMorphoToken); + } +} + +contract ConnectV2MorphoAave is MorphoAave { + string public constant name = "Morpho-Aave-v1.0"; +} diff --git a/contracts/mainnet/connectors/morpho/interface.sol b/contracts/mainnet/connectors/morpho/interface.sol deleted file mode 100644 index da192bb6..00000000 --- a/contracts/mainnet/connectors/morpho/interface.sol +++ /dev/null @@ -1,42 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; -pragma experimental ABIEncoderV2; - -interface IMorphoCore { - function supply( - address _poolTokenAddress, - address _onBehalf, - uint256 _amount, - uint256 _maxGasForMatching - ) external; - - function borrow( - address _poolTokenAddress, - uint256 _amount, - uint256 _maxGasForMatching - ) external; - - function withdraw( - address _poolTokenAddress, - uint256 _amount - ) external; - - function repay( - address _poolTokenAddress, - address _onBehalf, - uint256 _amount - ) external; - - function liquidate( - address _poolTokenBorrowedAddress, - address _poolTokenCollateralAddress, - address _borrower, - uint256 _amount - ) external; - - // (For AAVEV2: (aToken or variable debt token), COMPOUNDV2: cToken addresses) - function claimRewards( - address[] _tokenAddresses, - bool _tradeForMorphoToken, - ) external; -} \ No newline at end of file diff --git a/contracts/mainnet/connectors/morpho/main.sol b/contracts/mainnet/connectors/morpho/main.sol deleted file mode 100644 index e6cde28d..00000000 --- a/contracts/mainnet/connectors/morpho/main.sol +++ /dev/null @@ -1,176 +0,0 @@ -//SPDX-License-Identifier: MIT -pragma solidity ^0.7.0; -pragma experimental ABIEncoderV2; -import './helpers.sol'; -import './events.sol'; -import 'hardhat/console.sol'; - -abstract contract Morpho is Helpers, Events { - - function deposit ( - Underlying _pool, - address _tokenAddress, - address _poolTokenAddress, // if address weth (send eth) - uint256 _amount, // if max, check balance - uint256 _maxGasForMatching, // optional - uint256 _getId, - uint256 _setId - ) external payable returns(string memory _eventName, bytes memory _eventParam) { - - require(_pool == Underlying.AAVEV2 || _pool == Underlying.COMPOUNDV2, 'underlying-protocol-not-supported'); - - uint256 _amt = getUint(_getId, _amount); - - bool _isETH = _tokenAddress == ethAddr; - - TokenInterface _tokenContract = _isETH ? TokenInterface(wethAddr) : TokenInterface(_tokenAddress); - - if(_amt == uint256(-1)) { - _amt = _isETH ? address(this).balance : _tokenContract.balanceOf(address(this)); - } - - if(_isETH) convertEthToWeth(_isETH, _tokenContract, _amt); - - if(_pool == Underlying.AAVEV2) { - approve(_tokenContract, morphoAave, _amt); - morphoAave.supply(_poolTokenAddress, address(this), _amt, _maxGasForMatching); - } else { - approve(_tokenContract, morphoCompound, _amt); - morphoCompound.supply(_poolTokenAddress, address(this), _amt, _maxGasForMatching); - } - - setUint(_setId, _amt); - - _eventName = "LogDeposit(uint256,address,address,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode( - _pool, - _tokenAddress, - _poolTokenAddress, - _amt, - _maxGasForMatching, - _getId, - _setId - ); - } - - function borrow ( - Underlying _pool, - address _tokenAddress, - address _poolTokenAddress, //todo: dTokenaAddress? // if address weth (send eth) - uint256 _amount, - uint256 _maxGasForMatching, - uint256 _getId, - uint256 _setId - ) external payable returns(string memory _eventName, bytes memory _eventParam) { - - require(_pool == Underlying.AAVEV2 || _pool == Underlying.COMPOUNDV2, 'protocol-not-supported'); - - uint256 _amt = getUint(_getId, _amount); - - bool _isETH = _tokenAddress == ethAddr; - - if(_pool == Underlying.AAVEV2) { - morphoAave.borrow(_poolTokenAddress, _amt, _maxGasForMatching); - } else { - morphoCompound.borrow(_poolTokenAddress, _amt, _maxGasForMatching); - } - - if(_isETH) convertWethToEth(_isETH, tokenInterface(wethAddr), _amt); - - setUint(_setId, _amt); - - _eventName = "LogBorrow(uint256,address,uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode( - _pool, - _poolTokenAddress, - _amt, - _maxGasForMatching, - _getId, - _setId - ); - } - - function withdraw ( - Underlying _pool, - address _tokenAddress, - address _poolTokenAddress, // if address weth (send eth) - uint256 _amount, // amount max - uint256 _getId, - uint256 _setId - ) external payable returns(string memory _eventName, bytes memory _eventParam) { - - require(_pool == Underlying.AAVEV2 || _pool == Underlying.COMPOUNDV2, 'protocol not supported'); - - uint256 _amt = getUint(_getId, _amount); - bool _isETH = _tokenAddress == ethAddr; - address _token = _isETH ? wethAddr : _tokenAddress; - - if (_amt == uint256(-1)) _amt = _poolTokenAddress.balanceOf(address(this)); - - if(_pool == Underlying.AAVEV2) { - morphoAave.withdraw(_poolTokenAddress, _amt); - } else { - morphoCompound.withdraw(_poolTokenAddress, _amt); - } - - convertWethToEth(_isETH, TokenInterface(_token), _amt); - - setUint(_setId, _amt); - - _eventName = "LogWithdraw(uint256,bool,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(_pool, _isETH, _poolTokenAddress, _amt, _getId, _setId); - - } - - function payback ( - Underlying _pool, - address _tokenAddress, - address _poolTokenAddress, // if address weth (send eth) - uint256 _amount, // max value - uint256 _getId, - uint256 _setId - ) external payable returns(string memory _eventName, bytes memory _eventParam) { - - require(_pool == Underlying.AAVEV2 || _pool == Underlying.COMPOUNDV2, 'protocol not supported'); - - bool _isETH = _tokenAddress == ethAddr; - uint256 _amt = getUint(_getId, _amount); - address _token = _isETH ? wethAddr : _tokenAddress; - - if(_amt == uint256(-1)) { - _amt = _isETH ? _amt = address(this).balance : TokenInterface(_token).balanceOf(address(this)); - } - - if (_isETH) convertEthToWeth(_isETH, TokenInterface(_token), _amt); - - _pool == Underlying.AAVEV2 - ? morphoAave.repay(_poolTokenAddress, address(this), _amt) - : morphoCompound.repay(_poolTokenAddress, address(this), _amt); - - setUint(_setId, _amt); - - _eventName = "LogPayback(uint256,bool,address,uint256,uint256,uint256)"; - _eventParam = abi.encode(_pool, _isETH, _poolTokenAddress, _amt, _getId, _setId); - } - - function claim ( - Underlying _pool, - address[] _tokenAddresses, //todo: eth will be claimed as weth currently? - bool _tradeForMorphoToken - ) external payable returns(string memory _eventName, bytes memory _eventParam) { - - require(_pool == Underlying.AAVEV2 || _pool == Underlying.COMPOUNDV2, 'protocol not supported'); - - _pool == Underlying.AAVEV2 - ? morphoAave.claim(_tokenAddresses, _tradeForMorphoToken) - : morphoCompound.claim(_tokenAddresses, _tradeForMorphoToken); - - _eventName = "LogClaimed(uint256,address[],bool)"; - _eventParam = abi.encode(_pool, _tokenAddresses, _tradeForMorphoToken); - } - -} - -contract ConnectV2Morpho is Morpho { - string public constant name = "Morpho-v1.0"; -}