diff --git a/contracts/mainnet/connectors/morpho-blue/helpers.sol b/contracts/mainnet/connectors/morpho-blue/helpers.sol index bc9c6abd..43480293 100644 --- a/contracts/mainnet/connectors/morpho-blue/helpers.sol +++ b/contracts/mainnet/connectors/morpho-blue/helpers.sol @@ -34,26 +34,22 @@ abstract contract Helpers is Stores, Basic { address _onBehalf, uint256 _getId, Mode _mode - ) internal returns (TokenInterface _tokenContract, uint256 _amt) { + ) internal returns (MarketParams memory, uint256 _amt) { _amt = getUint(_getId, _assets); - bool _isEth; - if (_mode == Mode.Collateral) { - _isEth = _marketParams.collateralToken == ethAddr; - } else { - _isEth = _marketParams.loanToken == ethAddr; - } + bool _isEth = _mode == Mode.Collateral + ? _marketParams.collateralToken == ethAddr + : _marketParams.loanToken == ethAddr; - // Set the correct token contract - _tokenContract = _isEth - ? TokenInterface(wethAddr) - : TokenInterface(_marketParams.loanToken); + _marketParams = updateTokenAddresses(_marketParams); // Check for max value if (_assets == type(uint256).max) { uint256 _maxAvailable = _isEth ? address(this).balance - : _tokenContract.balanceOf(address(this)); + : TokenInterface(_marketParams.loanToken).balanceOf( + address(this) + ); if (_mode == Mode.Repay) { uint256 _amtDebt = getPaybackBalance(_marketParams, _onBehalf); _amt = min(_maxAvailable, _amtDebt); @@ -64,8 +60,14 @@ abstract contract Helpers is Stores, Basic { // Perform conversion if necessary if (_isEth) { - convertEthToWeth(true, _tokenContract, _amt); + convertEthToWeth( + true, + TokenInterface(_marketParams.loanToken), + _amt + ); } + + return (_marketParams, _amt); } /// @notice Handles Eth to Weth conversion if shares are provided. @@ -75,24 +77,29 @@ abstract contract Helpers is Stores, Basic { address _onBehalf, uint256 _getId, bool _isRepay - ) internal returns (TokenInterface _tokenContract, uint256 _assets) { + ) internal returns (MarketParams memory, uint256 _assets) { uint256 _shareAmt = getUint(_getId, _shares); bool _isEth = _marketParams.loanToken == ethAddr; - // Set the token contract based on whether the loan token is ETH - _tokenContract = _isEth - ? TokenInterface(wethAddr) - : TokenInterface(_marketParams.loanToken); + _marketParams = updateTokenAddresses(_marketParams); - // Handle the max share case or normal share conversion - if (_isRepay && _shares == type(uint256).max) { + // Handle the max share case + if (_shares == type(uint256).max) { uint256 _maxAvailable = _isEth ? address(this).balance - : _tokenContract.balanceOf(address(this)); - _assets = min( - _maxAvailable, - getPaybackBalance(_marketParams, _onBehalf) - ); + : TokenInterface(_marketParams.loanToken).balanceOf( + address(this) + ); + + // If it's repay calculate the min of balance available and debt to repay + if (_isRepay) { + _assets = min( + _maxAvailable, + getPaybackBalance(_marketParams, _onBehalf) + ); + } else { + _assets = _maxAvailable; + } } else { bytes32 _id = id(_marketParams); _assets = _toAssetsUp( @@ -104,8 +111,14 @@ abstract contract Helpers is Stores, Basic { // Perform ETH to WETH conversion if necessary if (_isEth) { - convertEthToWeth(true, _tokenContract, _assets); + convertEthToWeth( + true, + TokenInterface(_marketParams.loanToken), + _assets + ); } + + return (_marketParams, _assets); } /// @notice Helper function to find the minimum of two values @@ -163,4 +176,18 @@ abstract contract Helpers is Stores, Basic { ) internal pure returns (uint256) { return (x * y + (d - 1)) / d; } + + function updateTokenAddresses( + MarketParams memory _marketParams + ) internal returns (MarketParams memory) { + _marketParams.loanToken = _marketParams.loanToken == ethAddr + ? wethAddr + : _marketParams.loanToken; + + _marketParams.collateralToken = _marketParams.collateralToken == ethAddr + ? wethAddr + : _marketParams.collateralToken; + + return _marketParams; + } } diff --git a/contracts/mainnet/connectors/morpho-blue/main.sol b/contracts/mainnet/connectors/morpho-blue/main.sol index 079b9089..2d6ccdb5 100644 --- a/contracts/mainnet/connectors/morpho-blue/main.sol +++ b/contracts/mainnet/connectors/morpho-blue/main.sol @@ -24,26 +24,23 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final assets amount and token contract + uint256 _amt; ( - TokenInterface _tokenContract, // Loan token contract - uint256 _amt + _marketParams, // Updated token contracts in case of Eth + _amt ) = _performEthToWethConversion( - _marketParams, - _assets, - address(this), - _getId, - Mode.Other - ); + _marketParams, + _assets, + address(this), + _getId, + Mode.Other + ); - // Approving loan token for supplying - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.loanToken = address(_tokenContract); - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); uint256 _shares; (_assets, _shares) = MORPHO_BLUE.supply( @@ -86,26 +83,23 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final assets amount and token contract + uint256 _amt; ( - TokenInterface _tokenContract, // Loan token contract - uint256 _amt + _marketParams, // Updated token contracts in case of Eth + _amt ) = _performEthToWethConversion( - _marketParams, - _assets, - _onBehalf, - _getId, - Mode.Other - ); + _marketParams, + _assets, + _onBehalf, + _getId, + Mode.Other + ); - // Approving loan token for supplying - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.loanToken = address(_tokenContract); - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); uint256 _shares; (_assets, _shares) = MORPHO_BLUE.supply( @@ -133,7 +127,7 @@ abstract contract MorphoBlue is Helpers, Events { * @dev Supply ETH/ERC20 Token for lending. * @notice Supplies assets for a perfect share amount to Morpho Blue for lending. * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _shares The exact amount of shares to mint. (Max maount not allowed) + * @param _shares The exact amount of shares to mint. (For max: `uint256(-1)`) * @param _onBehalf The address that will get the shares. * @param _getId ID to retrieve amt. * @param _setId ID stores the amount of tokens deposited. @@ -149,26 +143,23 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final converted assets amount for approval and token contract + uint256 _amt; ( - TokenInterface _tokenContract, // Loan token contract - uint256 _amt // Shares amount converted to assets + _marketParams, // Updated token contracts in case of Eth + _amt // Shares amount converted to assets ) = _performEthToWethSharesConversion( - _marketParams, - _shares, - _onBehalf, - _getId, - false - ); + _marketParams, + _shares, + _onBehalf, + _getId, + false + ); - // Approving loan token for supplying - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.loanToken = address(_tokenContract); - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); (uint256 _assets, ) = MORPHO_BLUE.supply( _marketParams, @@ -208,26 +199,24 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final assets amount and token contract + uint256 _amt; ( - TokenInterface _tokenContract, // Collateral token contract - uint256 _amt + _marketParams, // Updated token contracts in case of Eth + _amt ) = _performEthToWethConversion( - _marketParams, - _assets, - address(this), - _getId, - Mode.Collateral - ); + _marketParams, + _assets, + address(this), + _getId, + Mode.Collateral + ); // Approving collateral token - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.collateralToken = address(_tokenContract); - _marketParams.loanToken = _marketParams.loanToken == ethAddr - ? wethAddr - : _marketParams.loanToken; + approve( + TokenInterface(_marketParams.collateralToken), + address(MORPHO_BLUE), + _amt + ); MORPHO_BLUE.supplyCollateral( _marketParams, @@ -261,26 +250,25 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { + uint256 _amt; // Final assets amount and token contract ( - TokenInterface _tokenContract, // Collateral token contract - uint256 _amt + _marketParams, // Updated token contracts in case of Eth + _amt ) = _performEthToWethConversion( - _marketParams, - _assets, - _onBehalf, - _getId, - Mode.Collateral - ); + _marketParams, + _assets, + _onBehalf, + _getId, + Mode.Collateral + ); // Approving collateral token - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.collateralToken = address(_tokenContract); - _marketParams.loanToken = _marketParams.loanToken == ethAddr - ? wethAddr - : _marketParams.loanToken; + approve( + TokenInterface(_marketParams.collateralToken), + address(MORPHO_BLUE), + _amt + ); MORPHO_BLUE.supplyCollateral( _marketParams, @@ -302,7 +290,7 @@ abstract contract MorphoBlue is Helpers, Events { } /** - * @notice Handles the withdrawal of collateral by a user from a specific market of a specific amount. + * @notice Handles the collateral withdrawals. * @dev The market to withdraw assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) * @param _marketParams The market to withdraw assets from. * @param _assets The amount of assets to withdraw. (For max: `uint256(-1)`) @@ -321,14 +309,7 @@ abstract contract MorphoBlue is Helpers, Events { { uint256 _amt = getUint(_getId, _assets); - // Updating token addresses - bool _collateralIsEth = _marketParams.collateralToken == ethAddr; - _marketParams.collateralToken = _collateralIsEth - ? wethAddr - : _marketParams.collateralToken; - _marketParams.loanToken = _marketParams.loanToken == ethAddr - ? wethAddr - : _marketParams.loanToken; + _marketParams = updateTokenAddresses(_marketParams); // If amount is max, fetch collateral value from Morpho's contract if (_amt == type(uint256).max) { @@ -344,7 +325,11 @@ abstract contract MorphoBlue is Helpers, Events { address(this) ); - convertWethToEth(_collateralIsEth, TokenInterface(wethAddr), _amt); + convertWethToEth( + _marketParams.collateralToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); setUint(_setId, _amt); @@ -375,15 +360,9 @@ abstract contract MorphoBlue is Helpers, Events { { uint256 _amt = getUint(_getId, _assets); - // Updating token addresses - bool _collateralIsEth = _marketParams.collateralToken == ethAddr; - _marketParams.collateralToken = _collateralIsEth - ? wethAddr - : _marketParams.collateralToken; - _marketParams.loanToken = _marketParams.loanToken == ethAddr - ? wethAddr - : _marketParams.loanToken; + _marketParams = updateTokenAddresses(_marketParams); + // If amount is max, fetch collateral value from Morpho's contract if (_amt == type(uint256).max) { bytes32 _id = id(_marketParams); Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); @@ -398,7 +377,11 @@ abstract contract MorphoBlue is Helpers, Events { ); if (_receiver == address(this)) - convertWethToEth(_collateralIsEth, TokenInterface(wethAddr), _amt); + convertWethToEth( + _marketParams.collateralToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); setUint(_setId, _amt); @@ -432,16 +415,14 @@ abstract contract MorphoBlue is Helpers, Events { returns (string memory _eventName, bytes memory _eventParam) { uint256 _amt = getUint(_getId, _assets); - bool _isEth = _marketParams.loanToken == ethAddr; - _marketParams.loanToken = _isEth ? wethAddr : _marketParams.loanToken; - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + + _marketParams = updateTokenAddresses(_marketParams); if (_amt == type(uint256).max) { bytes32 _id = id(_marketParams); Position memory _pos = MORPHO_BLUE.position(_id, address(this)); uint256 _shares = _pos.supplyShares; + _amt = _toAssetsUp( _shares, MORPHO_BLUE.market(_id).totalSupplyAssets, @@ -458,7 +439,11 @@ abstract contract MorphoBlue is Helpers, Events { address(this) ); - convertWethToEth(_isEth, TokenInterface(wethAddr), _assets); + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); setUint(_setId, _assets); @@ -494,16 +479,14 @@ abstract contract MorphoBlue is Helpers, Events { returns (string memory _eventName, bytes memory _eventParam) { uint256 _amt = getUint(_getId, _assets); - bool _isEth = _marketParams.loanToken == ethAddr; - _marketParams.loanToken = _isEth ? wethAddr : _marketParams.loanToken; - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + + _marketParams = updateTokenAddresses(_marketParams); if (_amt == type(uint256).max) { bytes32 _id = id(_marketParams); Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); uint256 _shares = _pos.supplyShares; + _amt = _toAssetsUp( _shares, MORPHO_BLUE.market(_id).totalSupplyAssets, @@ -521,7 +504,11 @@ abstract contract MorphoBlue is Helpers, Events { ); if (_receiver == address(this)) - convertWethToEth(_isEth, TokenInterface(wethAddr), _assets); + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); setUint(_setId, _assets); @@ -558,11 +545,8 @@ abstract contract MorphoBlue is Helpers, Events { returns (string memory _eventName, bytes memory _eventParam) { uint256 _shareAmt = getUint(_getId, _shares); - bool _isEth = _marketParams.loanToken == ethAddr; - _marketParams.loanToken = _isEth ? wethAddr : _marketParams.loanToken; - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + + _marketParams = updateTokenAddresses(_marketParams); if (_shareAmt == type(uint256).max) { bytes32 _id = id(_marketParams); @@ -579,7 +563,11 @@ abstract contract MorphoBlue is Helpers, Events { ); if (_receiver == address(this)) - convertWethToEth(_isEth, TokenInterface(wethAddr), _assets); + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); setUint(_setId, _assets); @@ -613,12 +601,8 @@ abstract contract MorphoBlue is Helpers, Events { returns (string memory _eventName, bytes memory _eventParam) { uint256 _amt = getUint(_getId, _assets); - bool _isETH = _marketParams.loanToken == ethAddr; - _marketParams.loanToken = _isETH ? wethAddr : _marketParams.loanToken; - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + _marketParams = updateTokenAddresses(_marketParams); (, uint256 _shares) = MORPHO_BLUE.borrow( _marketParams, @@ -628,7 +612,11 @@ abstract contract MorphoBlue is Helpers, Events { address(this) ); - convertWethToEth(_isETH, TokenInterface(wethAddr), _amt); + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); setUint(_setId, _amt); @@ -659,12 +647,8 @@ abstract contract MorphoBlue is Helpers, Events { returns (string memory _eventName, bytes memory _eventParam) { uint256 _amt = getUint(_getId, _assets); - bool _isETH = _marketParams.loanToken == ethAddr; - _marketParams.loanToken = _isETH ? wethAddr : _marketParams.loanToken; - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + _marketParams = updateTokenAddresses(_marketParams); (, uint256 _shares) = MORPHO_BLUE.borrow( _marketParams, @@ -675,7 +659,11 @@ abstract contract MorphoBlue is Helpers, Events { ); if (_receiver == address(this)) - convertWethToEth(_isETH, TokenInterface(wethAddr), _amt); + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); setUint(_setId, _amt); @@ -714,12 +702,8 @@ abstract contract MorphoBlue is Helpers, Events { returns (string memory _eventName, bytes memory _eventParam) { uint256 _shareAmt = getUint(_getId, _shares); - bool _isETH = _marketParams.loanToken == ethAddr; - _marketParams.loanToken = _isETH ? wethAddr : _marketParams.loanToken; - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + _marketParams = updateTokenAddresses(_marketParams); (uint256 _assets, ) = MORPHO_BLUE.borrow( _marketParams, @@ -730,7 +714,11 @@ abstract contract MorphoBlue is Helpers, Events { ); if (_receiver == address(this)) - convertWethToEth(_isETH, TokenInterface(wethAddr), _assets); + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); setUint(_setId, _assets); @@ -747,7 +735,7 @@ abstract contract MorphoBlue is Helpers, Events { } /** - * @notice Repays assets. + * @notice Repay assets. * @dev The market to repay assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) * @param _marketParams The market to repay assets to. * @param _assets The amount of assets to repay. (For max: `uint256(-1)`) @@ -764,26 +752,24 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final assets amount and token contract + uint256 _amt; ( - TokenInterface _tokenContract, - uint256 _amt // Assets final amount to repay + _marketParams, // Updated token contracts in case of Eth + _amt // Assets final amount to repay ) = _performEthToWethConversion( - _marketParams, - _assets, - address(this), - _getId, - Mode.Repay - ); + _marketParams, + _assets, + address(this), + _getId, + Mode.Repay + ); // Approving loan token for repaying - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.loanToken = address(_tokenContract); - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); uint256 _shares; (_assets, _shares) = MORPHO_BLUE.repay( @@ -826,26 +812,24 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final assets amount and token contract + uint256 _amt; ( - TokenInterface _tokenContract, - uint256 _amt // Assets final amount to repay + _marketParams, // Updated token contracts in case of Eth + _amt // Assets final amount to repay ) = _performEthToWethConversion( - _marketParams, - _assets, - _onBehalf, - _getId, - Mode.Repay - ); + _marketParams, + _assets, + _onBehalf, + _getId, + Mode.Repay + ); // Approving loan token for repaying - approve(_tokenContract, address(MORPHO_BLUE), _amt); - - // Updating token addresses - _marketParams.loanToken = address(_tokenContract); - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); uint256 _shares; (_assets, _shares) = MORPHO_BLUE.repay( @@ -889,19 +873,23 @@ abstract contract MorphoBlue is Helpers, Events { payable returns (string memory _eventName, bytes memory _eventParam) { - // Final assets amount and token contract + uint256 _assetsAmt; ( - TokenInterface _tokenContract, - uint256 _assetsAmt // Assets final amount to repay + _marketParams, // Updated token contracts in case of Eth + _assetsAmt // Assets final amount to repay ) = _performEthToWethSharesConversion( - _marketParams, - _shares, - _onBehalf, - _getId, - true - ); + _marketParams, + _shares, + _onBehalf, + _getId, + true + ); - approve(_tokenContract, address(MORPHO_BLUE), _assetsAmt); + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _assetsAmt + ); (uint256 _assets, ) = MORPHO_BLUE.repay( _marketParams,