Morpho-Aave contracts set up

This commit is contained in:
Shriya Tyagi 2022-10-12 06:27:45 +04:00
parent 9976f844dd
commit 1bfd45527e
6 changed files with 281 additions and 235 deletions

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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
);
}

View File

@ -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";
}

View File

@ -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;
}

View File

@ -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";
}