From 1e4a1d9574a0bdbc68693413091cc92eb1c0ebbd Mon Sep 17 00:00:00 2001 From: Shriya Tyagi Date: Sat, 16 Dec 2023 18:08:07 +0530 Subject: [PATCH] feat: add prettier --- .../mainnet/connectors/morpho-blue/events.sol | 181 +- .../connectors/morpho-blue/helpers.sol | 286 ++- .../mainnet/connectors/morpho-blue/main.sol | 1806 ++++++++--------- 3 files changed, 1135 insertions(+), 1138 deletions(-) diff --git a/contracts/mainnet/connectors/morpho-blue/events.sol b/contracts/mainnet/connectors/morpho-blue/events.sol index 186c333..6dd2355 100644 --- a/contracts/mainnet/connectors/morpho-blue/events.sol +++ b/contracts/mainnet/connectors/morpho-blue/events.sol @@ -1,106 +1,105 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.8.2; -pragma experimental ABIEncoderV2; -import { MarketParams } from "./interfaces/IMorpho.sol"; +import {MarketParams} from "./interfaces/IMorpho.sol"; contract Events { - event LogSupplyAssets( - MarketParams marketParams, - uint256 assets, - uint256 shares, - uint256 getId, - uint256 setId - ); + event LogSupplyAssets( + MarketParams marketParams, + uint256 assets, + uint256 shares, + uint256 getId, + uint256 setId + ); - event LogSupplyOnBehalf( - MarketParams marketParams, - uint256 assets, - uint256 shares, - address onBehalf, - uint256 getId, - uint256 setId - ); + event LogSupplyOnBehalf( + MarketParams marketParams, + uint256 assets, + uint256 shares, + address onBehalf, + uint256 getId, + uint256 setId + ); - event LogSupplyCollateral( - MarketParams marketParams, - uint256 assets, - uint256 getId, - uint256 setId - ); + event LogSupplyCollateral( + MarketParams marketParams, + uint256 assets, + uint256 getId, + uint256 setId + ); - event LogSupplyCollateralOnBehalf( - MarketParams marketParams, - uint256 assets, - address onBehalf, - uint256 getId, - uint256 setId - ); + event LogSupplyCollateralOnBehalf( + MarketParams marketParams, + uint256 assets, + address onBehalf, + uint256 getId, + uint256 setId + ); - event LogBorrow( - MarketParams marketParams, - uint256 amounts, - uint256 shares, - uint256 getId, - uint256 setId - ); + event LogBorrow( + MarketParams marketParams, + uint256 amounts, + uint256 shares, + uint256 getId, + uint256 setId + ); - event LogBorrowOnBehalf( - MarketParams marketParams, - uint256 amounts, - uint256 shares, - address onBehalf, - address receiver, - uint256 getId, - uint256 setId - ); + event LogBorrowOnBehalf( + MarketParams marketParams, + uint256 amounts, + uint256 shares, + address onBehalf, + address receiver, + uint256 getId, + uint256 setId + ); - event LogWithdraw( - MarketParams marketParams, - uint256 amounts, - uint256 shares, - uint256 getId, - uint256 setId - ); + event LogWithdraw( + MarketParams marketParams, + uint256 amounts, + uint256 shares, + uint256 getId, + uint256 setId + ); - event LogWithdrawOnBehalf( - MarketParams marketParams, - uint256 amounts, - uint256 shares, - address onBehalf, - uint256 getId, - uint256 setId - ); + event LogWithdrawOnBehalf( + MarketParams marketParams, + uint256 amounts, + uint256 shares, + address onBehalf, + uint256 getId, + uint256 setId + ); - event LogWithdrawCollateral( - MarketParams marketParams, - uint256 amounts, - uint256 getId, - uint256 setId - ); + event LogWithdrawCollateral( + MarketParams marketParams, + uint256 amounts, + uint256 getId, + uint256 setId + ); - event LogWithdrawCollateralOnBehalf( - MarketParams marketParams, - uint256 amounts, - address onBehalf, - address receiver, - uint256 getId, - uint256 setId - ); + event LogWithdrawCollateralOnBehalf( + MarketParams marketParams, + uint256 amounts, + address onBehalf, + address receiver, + uint256 getId, + uint256 setId + ); - event LogRepay( - MarketParams marketParams, - uint256 amounts, - uint256 shares, - uint256 getId, - uint256 setId - ); + event LogRepay( + MarketParams marketParams, + uint256 amounts, + uint256 shares, + uint256 getId, + uint256 setId + ); - event LogRepayOnBehalf( - MarketParams marketParams, - uint256 amounts, - uint256 shares, - address onBehalf, - uint256 getId, - uint256 setId - ); -} \ No newline at end of file + event LogRepayOnBehalf( + MarketParams marketParams, + uint256 amounts, + uint256 shares, + address onBehalf, + uint256 getId, + uint256 setId + ); +} diff --git a/contracts/mainnet/connectors/morpho-blue/helpers.sol b/contracts/mainnet/connectors/morpho-blue/helpers.sol index 9978649..ab0dfd8 100644 --- a/contracts/mainnet/connectors/morpho-blue/helpers.sol +++ b/contracts/mainnet/connectors/morpho-blue/helpers.sol @@ -1,180 +1,178 @@ //SPDX-License-Identifier: MIT pragma solidity ^0.8.2; -import { Id, IMorpho, MarketParams, Position, Market } from "./interfaces/IMorpho.sol"; +import {Id, IMorpho, MarketParams, Position, Market} from "./interfaces/IMorpho.sol"; import "../../common/stores.sol"; import "../../common/basic.sol"; import "../../common/interfaces.sol"; -import { MorphoBalancesLib } from "./libraries/periphery/MorphoBalancesLib.sol"; -import { UtilsLib } from "./libraries/UtilsLib.sol"; -import { MarketParamsLib } from "./libraries/MarketParamsLib.sol"; +import {MorphoBalancesLib} from "./libraries/periphery/MorphoBalancesLib.sol"; +import {UtilsLib} from "./libraries/UtilsLib.sol"; +import {MarketParamsLib} from "./libraries/MarketParamsLib.sol"; abstract contract Helpers is Stores, Basic { - using MorphoBalancesLib for IMorpho; - using MarketParamsLib for MarketParams; - using UtilsLib for uint256; + using MorphoBalancesLib for IMorpho; + using MarketParamsLib for MarketParams; + using UtilsLib for uint256; - IMorpho public constant MORPHO_BLUE = - IMorpho(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0); // TODO: Update + IMorpho public constant MORPHO_BLUE = + IMorpho(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0); // TODO: Update - uint256 internal constant MARKET_PARAMS_BYTES_LENGTH = 5 * 32; + uint256 internal constant MARKET_PARAMS_BYTES_LENGTH = 5 * 32; - /// @dev The number of virtual assets of 1 enforces a conversion rate between shares and assets when a market is - /// empty. - uint256 internal constant VIRTUAL_ASSETS = 1; + /// @dev The number of virtual assets of 1 enforces a conversion rate between shares and assets when a market is + /// empty. + uint256 internal constant VIRTUAL_ASSETS = 1; - /// @dev The number of virtual shares has been chosen low enough to prevent overflows, and high enough to ensure - /// high precision computations. - uint256 internal constant VIRTUAL_SHARES = 1e6; + /// @dev The number of virtual shares has been chosen low enough to prevent overflows, and high enough to ensure + /// high precision computations. + uint256 internal constant VIRTUAL_SHARES = 1e6; - enum Mode { - Collateral, - Repay, - Supply - } + enum Mode { + Collateral, + Repay, + Supply + } - /// @notice Handles Eth to Weth conversion if assets are provided. - function _performEthToWethConversion( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - uint256 _getId, - Mode _mode - ) internal returns (MarketParams memory, uint256 _amt) { - _amt = getUint(_getId, _assets); + /// @notice Handles Eth to Weth conversion if assets are provided. + function _performEthToWethConversion( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + uint256 _getId, + Mode _mode + ) internal returns (MarketParams memory, uint256 _amt) { + _amt = getUint(_getId, _assets); - bool _isEth = _mode == Mode.Collateral - ? _marketParams.collateralToken == ethAddr - : _marketParams.loanToken == ethAddr; + bool _isEth = _mode == Mode.Collateral + ? _marketParams.collateralToken == ethAddr + : _marketParams.loanToken == ethAddr; - _marketParams = updateTokenAddresses(_marketParams); + _marketParams = updateTokenAddresses(_marketParams); - // Check for max value - if (_assets == type(uint256).max) { - uint256 _maxAvailable = _isEth - ? address(this).balance - : TokenInterface(_marketParams.loanToken).balanceOf( - address(this) - ); - if (_mode == Mode.Repay) { - uint256 _amtDebt = getPaybackBalance(_marketParams, _onBehalf); - _amt = _maxAvailable.min(_amtDebt); // TODO: Ask - } else { - _amt = _maxAvailable; - } - } + // Check for max value + if (_assets == type(uint256).max) { + uint256 _maxAvailable = _isEth + ? address(this).balance + : TokenInterface(_marketParams.loanToken).balanceOf( + address(this) + ); + if (_mode == Mode.Repay) { + uint256 _amtDebt = getPaybackBalance(_marketParams, _onBehalf); + _amt = _maxAvailable.min(_amtDebt); // TODO: Ask + } else { + _amt = _maxAvailable; + } + } - // Perform conversion if necessary - convertEthToWeth( - true, - TokenInterface(_marketParams.loanToken), - _amt - ); + // Perform conversion if necessary + convertEthToWeth(true, TokenInterface(_marketParams.loanToken), _amt); - return (_marketParams, _amt); - } + return (_marketParams, _amt); + } - /// @notice Handles Eth to Weth conversion if shares are provided. - function _performEthToWethSharesConversion( - MarketParams memory _marketParams, - uint256 _shares, - address _onBehalf, - uint256 _getId, - bool _isRepay - ) internal returns (MarketParams memory, uint256 _assets) { - uint256 _shareAmt = getUint(_getId, _shares); - bool _isEth = _marketParams.loanToken == ethAddr; + /// @notice Handles Eth to Weth conversion if shares are provided. + function _performEthToWethSharesConversion( + MarketParams memory _marketParams, + uint256 _shares, + address _onBehalf, + uint256 _getId, + bool _isRepay + ) internal returns (MarketParams memory, uint256 _assets) { + uint256 _shareAmt = getUint(_getId, _shares); + bool _isEth = _marketParams.loanToken == ethAddr; - _marketParams = updateTokenAddresses(_marketParams); + _marketParams = updateTokenAddresses(_marketParams); - // Handle the max share case - if (_shares == type(uint256).max) { - uint256 _maxAvailable = _isEth - ? address(this).balance - : TokenInterface(_marketParams.loanToken).balanceOf( - address(this) - ); + // Handle the max share case + if (_shares == type(uint256).max) { + uint256 _maxAvailable = _isEth + ? address(this).balance + : TokenInterface(_marketParams.loanToken).balanceOf( + address(this) + ); - // If it's repay calculate the min of balance available and debt to repay - if (_isRepay) { - _assets = _maxAvailable.min( - getPaybackBalance(_marketParams, _onBehalf) // TODO: Ask - ); - } else { - _assets = _maxAvailable; - } - } else { - (uint256 totalSupplyAssets, uint256 totalSupplyShares, , ) = MORPHO_BLUE.expectedMarketBalances(_marketParams); + // If it's repay calculate the min of balance available and debt to repay + if (_isRepay) { + _assets = _maxAvailable.min( + getPaybackBalance(_marketParams, _onBehalf) // TODO: Ask + ); + } else { + _assets = _maxAvailable; + } + } else { + ( + uint256 totalSupplyAssets, + uint256 totalSupplyShares, + , - _assets = _toAssetsUp( - _shareAmt, - totalSupplyAssets, - totalSupplyShares - ); - } + ) = MORPHO_BLUE.expectedMarketBalances(_marketParams); - // Perform ETH to WETH conversion if necessary - convertEthToWeth( - true, - TokenInterface(_marketParams.loanToken), - _assets - ); + _assets = _toAssetsUp( + _shareAmt, + totalSupplyAssets, + totalSupplyShares + ); + } - return (_marketParams, _assets); - } + // Perform ETH to WETH conversion if necessary + convertEthToWeth( + true, + TokenInterface(_marketParams.loanToken), + _assets + ); - /// @notice Returns the payback balance in assets. - function getPaybackBalance( - MarketParams memory _marketParams, - address _onBehalf - ) internal view returns (uint256 _assets) { - Id _id = _marketParams.id(); + return (_marketParams, _assets); + } - uint256 _shareAmt = MORPHO_BLUE.position(_id, _onBehalf).supplyShares; + /// @notice Returns the payback balance in assets. + function getPaybackBalance( + MarketParams memory _marketParams, + address _onBehalf + ) internal view returns (uint256 _assets) { + Id _id = _marketParams.id(); - (uint256 totalSupplyAssets, uint256 totalSupplyShares, , ) = MORPHO_BLUE.expectedMarketBalances(_marketParams); + uint256 _shareAmt = MORPHO_BLUE.position(_id, _onBehalf).supplyShares; - _assets = _toAssetsUp( - _shareAmt, - totalSupplyAssets, - totalSupplyShares - ); - } + (uint256 totalSupplyAssets, uint256 totalSupplyShares, , ) = MORPHO_BLUE + .expectedMarketBalances(_marketParams); - /// @notice Calculates the value of `shares` quoted in assets, rounding up. - function _toAssetsUp( - uint256 _shares, - uint256 _totalAssets, - uint256 _totalShares - ) internal pure returns (uint256) { - return - _mulDivUp( - _shares, - _totalAssets + VIRTUAL_ASSETS, - _totalShares + VIRTUAL_SHARES - ); - } + _assets = _toAssetsUp(_shareAmt, totalSupplyAssets, totalSupplyShares); + } - /// @notice Returns (`x` * `y`) / `d` rounded up. - function _mulDivUp( - uint256 x, - uint256 y, - uint256 d - ) internal pure returns (uint256) { - return (x * y + (d - 1)) / d; - } + /// @notice Calculates the value of `shares` quoted in assets, rounding up. + function _toAssetsUp( + uint256 _shares, + uint256 _totalAssets, + uint256 _totalShares + ) internal pure returns (uint256) { + return + _mulDivUp( + _shares, + _totalAssets + VIRTUAL_ASSETS, + _totalShares + VIRTUAL_SHARES + ); + } - function updateTokenAddresses( - MarketParams memory _marketParams - ) internal pure returns (MarketParams memory) { - _marketParams.loanToken = _marketParams.loanToken == ethAddr - ? wethAddr - : _marketParams.loanToken; + /// @notice Returns (`x` * `y`) / `d` rounded up. + function _mulDivUp( + uint256 x, + uint256 y, + uint256 d + ) internal pure returns (uint256) { + return (x * y + (d - 1)) / d; + } - _marketParams.collateralToken = _marketParams.collateralToken == ethAddr - ? wethAddr - : _marketParams.collateralToken; + function updateTokenAddresses( + MarketParams memory _marketParams + ) internal pure returns (MarketParams memory) { + _marketParams.loanToken = _marketParams.loanToken == ethAddr + ? wethAddr + : _marketParams.loanToken; - return _marketParams; - } + _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 dfa597c..48f0c3f 100644 --- a/contracts/mainnet/connectors/morpho-blue/main.sol +++ b/contracts/mainnet/connectors/morpho-blue/main.sol @@ -3,912 +3,912 @@ pragma solidity ^0.8.2; import "./helpers.sol"; import "./events.sol"; -import { MarketParamsLib } from "./libraries/MarketParamsLib.sol"; +import {MarketParamsLib} from "./libraries/MarketParamsLib.sol"; abstract contract MorphoBlue is Helpers, Events { - using MarketParamsLib for MarketParams; - - /** - * @dev Supply ETH/ERC20 Token for lending. - * @notice Supplies assets to Morpho Blue for lending. - * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _assets The amount of assets to supply. (For max: `uint256(-1)`) - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function supply( - MarketParams memory _marketParams, - uint256 _assets, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - ( - _marketParams, // Updated token contracts in case of Eth - _amt - ) = _performEthToWethConversion( - _marketParams, - _assets, - address(this), - _getId, - Mode.Supply - ); - - approve( - TokenInterface(_marketParams.loanToken), - address(MORPHO_BLUE), - _amt - ); - - uint256 _shares; - (_assets, _shares) = MORPHO_BLUE.supply( - _marketParams, - _amt, - 0, - address(this), - new bytes(0) - ); - - setUint(_setId, _assets); - - _eventName = "LogSupplyAssets((address,address,address,address,unit256),unit256,unit256,unit256,unit256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _getId, - _setId - ); - } - - /** - * @dev Supply ETH/ERC20 Token for lending. - * @notice Supplies assets to Morpho Blue for lending. - * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _assets The amount of assets to supply. (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. - */ - function supplyOnBehalf( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - ( - _marketParams, // Updated token contracts in case of Eth - _amt - ) = _performEthToWethConversion( - _marketParams, - _assets, - _onBehalf, - _getId, - Mode.Supply - ); - - approve( - TokenInterface(_marketParams.loanToken), - address(MORPHO_BLUE), - _amt - ); - - uint256 _shares; - (_assets, _shares) = MORPHO_BLUE.supply( - _marketParams, - _amt, - 0, - _onBehalf, - new bytes(0) - ); - - setUint(_setId, _assets); - - _eventName = "LogSupplyOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _onBehalf, - _getId, - _setId - ); - } - - /** - * @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. (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. - */ - function supplySharesOnBehalf( - MarketParams memory _marketParams, - uint256 _shares, - address _onBehalf, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - ( - _marketParams, // Updated token contracts in case of Eth - _amt // Shares amount converted to assets - ) = _performEthToWethSharesConversion( - _marketParams, - _shares, - _onBehalf, - _getId, - false - ); - - approve( - TokenInterface(_marketParams.loanToken), - address(MORPHO_BLUE), - _amt - ); - - (uint256 _assets, ) = MORPHO_BLUE.supply( - _marketParams, - _amt, - _shares, - _onBehalf, - new bytes(0) - ); - - setUint(_setId, _assets); - - _eventName = "LogSupplyOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _onBehalf, - _getId, - _setId - ); - } - - /** - * @notice Supply ETH/ERC20 Token for collateralization. - * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _assets The amount of assets to supply. (For max: `uint256(-1)`) - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function supplyCollateral( - MarketParams memory _marketParams, - uint256 _assets, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - ( - _marketParams, // Updated token contracts in case of Eth - _amt - ) = _performEthToWethConversion( - _marketParams, - _assets, - address(this), - _getId, - Mode.Collateral - ); - - // Approving collateral token - approve( - TokenInterface(_marketParams.collateralToken), - address(MORPHO_BLUE), - _amt - ); - - MORPHO_BLUE.supplyCollateral( - _marketParams, - _amt, - address(this), - new bytes(0) - ); - - setUint(_setId, _amt); - - _eventName = "LogSupplyCollateral((address,address,address,address,unit256),uint256,uint256,uint256)"; - _eventParam = abi.encode(_marketParams, _assets, _getId, _setId); - } - - /** - * @notice Supplies `assets` of collateral on behalf of `onBehalf`, optionally calling back the caller's `onMorphoSupplyCollateral` function with the given `data`. - * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _assets The amount of assets to supply. (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. - */ - function supplyCollateralOnBehalf( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - // Final assets amount and token contract - ( - _marketParams, // Updated token contracts in case of Eth - _amt - ) = _performEthToWethConversion( - _marketParams, - _assets, - _onBehalf, - _getId, - Mode.Collateral - ); - - // Approving collateral token - approve( - TokenInterface(_marketParams.collateralToken), - address(MORPHO_BLUE), - _amt - ); - - MORPHO_BLUE.supplyCollateral( - _marketParams, - _amt, - _onBehalf, - new bytes(0) - ); - - setUint(_setId, _amt); - - _eventName = "LogSupplyCollateralOnBehalf((address,address,address,address,unit256),uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _onBehalf, - _getId, - _setId - ); - } - - /** - * @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)`) - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function withdrawCollateral( - MarketParams memory _marketParams, - uint256 _assets, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt = getUint(_getId, _assets); - - _marketParams = updateTokenAddresses(_marketParams); - - // If amount is max, fetch collateral value from Morpho's contract - if (_amt == type(uint256).max) { - Id _id = _marketParams.id(); - Position memory _pos = MORPHO_BLUE.position(_id, address(this)); - _amt = _pos.collateral; - } - - MORPHO_BLUE.withdrawCollateral( - _marketParams, - _amt, - address(this), - address(this) - ); - - convertWethToEth( - _marketParams.collateralToken == ethAddr, - TokenInterface(wethAddr), - _amt - ); - - setUint(_setId, _amt); - - _eventName = "LogWithdrawCollateral((address,address,address,address,unit256),uint256,uint256,uint256)"; - _eventParam = abi.encode(_marketParams, _amt, _getId, _setId); - } - - /** - * @notice Handles the withdrawal of collateral by a user from a specific market of a specific amount. - * @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)`) - * @param _onBehalf The address that already deposited position. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function withdrawCollateralOnBehalf( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - address _receiver, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt = getUint(_getId, _assets); - - _marketParams = updateTokenAddresses(_marketParams); - - // If amount is max, fetch collateral value from Morpho's contract - if (_amt == type(uint256).max) { - Id _id = _marketParams.id(); - Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); - _amt = _pos.collateral; - } - - MORPHO_BLUE.withdrawCollateral( - _marketParams, - _amt, - _onBehalf, - _receiver - ); - - if (_receiver == address(this)) - convertWethToEth( - _marketParams.collateralToken == ethAddr, - TokenInterface(wethAddr), - _amt - ); - - setUint(_setId, _amt); - - _eventName = "LogWithdrawCollateralOnBehalf((address,address,address,address,unit256),uint256,address,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _amt, - _onBehalf, - _receiver, - _getId, - _setId - ); - } - - /** - * @notice Handles the withdrawal of supply. - * @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)`) - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function withdraw( - MarketParams memory _marketParams, - uint256 _assets, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt = getUint(_getId, _assets); - - _marketParams = updateTokenAddresses(_marketParams); - - uint256 _shares = 0; - - // Using shares for max amounts to make sure no dust is left on the contract - if (_amt == type(uint256).max) { - Id _id = _marketParams.id(); - Position memory _pos = MORPHO_BLUE.position(_id, address(this)); - _shares = _pos.supplyShares; - _amt = 0; - } - - // In case of max share amount will be used - (_assets, _shares) = MORPHO_BLUE.withdraw( - _marketParams, - _amt, - _shares, - address(this), - address(this) - ); - - convertWethToEth( - _marketParams.loanToken == ethAddr, - TokenInterface(wethAddr), - _assets - ); - - setUint(_setId, _assets); - - _eventName = "LogWithdraw((address,address,address,address,unit256),uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _getId, - _setId - ); - } - - /** - * @notice Handles the withdrawal of a specified amount of assets by a user from a specific market. - * @dev The market to withdraw assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _marketParams The parameters of the market. - * @param _assets The amount of assets the user is withdrawing. (For max: `uint256(-1)`) - * @param _onBehalf The address who's position to withdraw from. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function withdrawOnBehalf( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - address _receiver, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt = getUint(_getId, _assets); - - _marketParams = updateTokenAddresses(_marketParams); - - uint256 _shares = 0; - // Using shares for max amounts to make sure no dust is left on the contract - if (_amt == type(uint256).max) { - Id _id = _marketParams.id(); - Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); - _shares = _pos.supplyShares; - _amt = 0; - } - - (_assets, _shares) = MORPHO_BLUE.withdraw( - _marketParams, - _amt, - _shares, - _onBehalf, - _receiver - ); - - if (_receiver == address(this)) - convertWethToEth( - _marketParams.loanToken == ethAddr, - TokenInterface(wethAddr), - _assets - ); - - setUint(_setId, _assets); - - _eventName = "LogWithdrawOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _onBehalf, - _getId, - _setId - ); - } - - /** - * @notice Handles the withdrawal of a specified amount of assets by a user from a specific market. - * @dev The market to withdraw assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _marketParams The parameters of the market. - * @param _shares The amount of shares the user is withdrawing. (For max: `uint256(-1)`) - * @param _onBehalf The address who's position to withdraw from. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens deposited. - */ - function withdrawSharesOnBehalf( - MarketParams memory _marketParams, - uint256 _shares, - address _onBehalf, - address _receiver, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _shareAmt = getUint(_getId, _shares); - - _marketParams = updateTokenAddresses(_marketParams); - - if (_shareAmt == type(uint256).max) { - Id _id = _marketParams.id(); - Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); - _shareAmt = _pos.supplyShares; - } - - (uint256 _assets, ) = MORPHO_BLUE.withdraw( - _marketParams, - 0, - _shareAmt, - _onBehalf, - _receiver - ); - - if (_receiver == address(this)) - convertWethToEth( - _marketParams.loanToken == ethAddr, - TokenInterface(wethAddr), - _assets - ); - - setUint(_setId, _assets); - - _eventName = "LogWithdrawOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shareAmt, - _onBehalf, - _getId, - _setId - ); - } - - /** - * @notice Borrows assets. - * @dev The market to borrow assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _marketParams The market to borrow assets from. - * @param _assets The amount of assets to borrow. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens borrowed. - */ - function borrow( - MarketParams memory _marketParams, - uint256 _assets, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt = getUint(_getId, _assets); - - _marketParams = updateTokenAddresses(_marketParams); - - (, uint256 _shares) = MORPHO_BLUE.borrow( - _marketParams, - _amt, - 0, - address(this), - address(this) - ); - - convertWethToEth( - _marketParams.loanToken == ethAddr, - TokenInterface(wethAddr), - _amt - ); - - setUint(_setId, _amt); - - _eventName = "LogBorrow((address,address,address,address,unit256),uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode(_marketParams, _amt, _shares, _getId, _setId); - } - - /** - * @notice Borrows `assets` on behalf of `onBehalf` to `receiver`. - * @dev The market to borrow assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _marketParams The market to borrow assets from. - * @param _assets The amount of assets to borrow. - * @param _onBehalf The address that will recieve the borrowing assets and own the borrow position. - * @param _receiver The address that will recieve the borrowed assets. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens borrowed. - */ - function borrowOnBehalf( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - address _receiver, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt = getUint(_getId, _assets); - - _marketParams = updateTokenAddresses(_marketParams); - - (, uint256 _shares) = MORPHO_BLUE.borrow( - _marketParams, - _amt, - 0, - _onBehalf, - _receiver - ); - - if (_receiver == address(this)) - convertWethToEth( - _marketParams.loanToken == ethAddr, - TokenInterface(wethAddr), - _amt - ); - - setUint(_setId, _amt); - - _eventName = "LogBorrowOnBehalf((address,address,address,address,unit256),uint256,uint256,address,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _amt, - _shares, - _onBehalf, - _receiver, - _getId, - _setId - ); - } - - /** - * @notice Borrows `shares` on behalf of `onBehalf` to `receiver`. - * @dev The market to borrow assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _marketParams The market to borrow assets from. - * @param _shares The amount of shares to mint. - * @param _onBehalf The address that will own the borrow position. - * @param _receiver The address that will recieve the borrowed assets. - * @param _getId ID to retrieve shares amt. - * @param _setId ID stores the amount of tokens borrowed. - */ - function borrowOnBehalfShares( - MarketParams memory _marketParams, - uint256 _shares, - address _onBehalf, - address _receiver, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _shareAmt = getUint(_getId, _shares); - - _marketParams = updateTokenAddresses(_marketParams); - - (uint256 _assets, ) = MORPHO_BLUE.borrow( - _marketParams, - 0, - _shareAmt, - _onBehalf, - _receiver - ); - - if (_receiver == address(this)) - convertWethToEth( - _marketParams.loanToken == ethAddr, - TokenInterface(wethAddr), - _assets - ); - - setUint(_setId, _assets); - - _eventName = "LogBorrowOnBehalf((address,address,address,address,unit256),uint256,uint256,address,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shareAmt, - _onBehalf, - _receiver, - _getId, - _setId - ); - } - - /** - * @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)`) - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens repaid. - */ - function repay( - MarketParams memory _marketParams, - uint256 _assets, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - ( - _marketParams, // Updated token contracts in case of Eth - _amt // Assets final amount to repay - ) = _performEthToWethConversion( - _marketParams, - _assets, - address(this), - _getId, - Mode.Repay - ); - - // Approving loan token for repaying - approve( - TokenInterface(_marketParams.loanToken), - address(MORPHO_BLUE), - _amt - ); - - uint256 _shares; - (_assets, _shares) = MORPHO_BLUE.repay( - _marketParams, - _amt, - 0, - address(this), - new bytes(0) - ); - - setUint(_setId, _assets); - - _eventName = "LogRepay((address,address,address,address,unit256),uint256,uint256,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _getId, - _setId - ); - } - - /** - * @notice Repays assets on behalf. - * @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)`) - * @param _onBehalf The address whose loan will be repaid. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens repaid. - */ - function repayOnBehalf( - MarketParams memory _marketParams, - uint256 _assets, - address _onBehalf, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _amt; - ( - _marketParams, // Updated token contracts in case of Eth - _amt // Assets final amount to repay - ) = _performEthToWethConversion( - _marketParams, - _assets, - _onBehalf, - _getId, - Mode.Repay - ); - - // Approving loan token for repaying - approve( - TokenInterface(_marketParams.loanToken), - address(MORPHO_BLUE), - _amt - ); - - uint256 _shares; - (_assets, _shares) = MORPHO_BLUE.repay( - _marketParams, - _amt, - 0, - _onBehalf, - new bytes(0) - ); - - setUint(_setId, _assets); - - _eventName = "LogRepayOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _onBehalf, - _getId, - _setId - ); - } - - /** - * @notice Repays shares on behalf. - * @dev The market to repay assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) - * @param _marketParams The market to repay assets to. - * @param _shares The amount of shares to burn. (For max: `uint256(-1)`) - * @param _onBehalf The address whose loan will be repaid. - * @param _getId ID to retrieve amt. - * @param _setId ID stores the amount of tokens repaid. - */ - function repayOnBehalfShares( - MarketParams memory _marketParams, - uint256 _shares, - address _onBehalf, - uint256 _getId, - uint256 _setId - ) - external - payable - returns (string memory _eventName, bytes memory _eventParam) - { - uint256 _assetsAmt; - ( - _marketParams, // Updated token contracts in case of Eth - _assetsAmt // Assets final amount to repay - ) = _performEthToWethSharesConversion( - _marketParams, - _shares, - _onBehalf, - _getId, - true - ); - - approve( - TokenInterface(_marketParams.loanToken), - address(MORPHO_BLUE), - _assetsAmt - ); - - (uint256 _assets, ) = MORPHO_BLUE.repay( - _marketParams, - _assetsAmt, - 0, - _onBehalf, - new bytes(0) - ); - - setUint(_setId, _assets); - - _eventName = "LogRepayOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; - _eventParam = abi.encode( - _marketParams, - _assets, - _shares, - _onBehalf, - _getId, - _setId - ); - } + using MarketParamsLib for MarketParams; + + /** + * @dev Supply ETH/ERC20 Token for lending. + * @notice Supplies assets to Morpho Blue for lending. + * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _assets The amount of assets to supply. (For max: `uint256(-1)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function supply( + MarketParams memory _marketParams, + uint256 _assets, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + ( + _marketParams, // Updated token contracts in case of Eth + _amt + ) = _performEthToWethConversion( + _marketParams, + _assets, + address(this), + _getId, + Mode.Supply + ); + + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); + + uint256 _shares; + (_assets, _shares) = MORPHO_BLUE.supply( + _marketParams, + _amt, + 0, + address(this), + new bytes(0) + ); + + setUint(_setId, _assets); + + _eventName = "LogSupplyAssets((address,address,address,address,unit256),unit256,unit256,unit256,unit256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _getId, + _setId + ); + } + + /** + * @dev Supply ETH/ERC20 Token for lending. + * @notice Supplies assets to Morpho Blue for lending. + * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _assets The amount of assets to supply. (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. + */ + function supplyOnBehalf( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + ( + _marketParams, // Updated token contracts in case of Eth + _amt + ) = _performEthToWethConversion( + _marketParams, + _assets, + _onBehalf, + _getId, + Mode.Supply + ); + + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); + + uint256 _shares; + (_assets, _shares) = MORPHO_BLUE.supply( + _marketParams, + _amt, + 0, + _onBehalf, + new bytes(0) + ); + + setUint(_setId, _assets); + + _eventName = "LogSupplyOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _onBehalf, + _getId, + _setId + ); + } + + /** + * @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. (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. + */ + function supplySharesOnBehalf( + MarketParams memory _marketParams, + uint256 _shares, + address _onBehalf, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + ( + _marketParams, // Updated token contracts in case of Eth + _amt // Shares amount converted to assets + ) = _performEthToWethSharesConversion( + _marketParams, + _shares, + _onBehalf, + _getId, + false + ); + + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); + + (uint256 _assets, ) = MORPHO_BLUE.supply( + _marketParams, + _amt, + _shares, + _onBehalf, + new bytes(0) + ); + + setUint(_setId, _assets); + + _eventName = "LogSupplyOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _onBehalf, + _getId, + _setId + ); + } + + /** + * @notice Supply ETH/ERC20 Token for collateralization. + * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _assets The amount of assets to supply. (For max: `uint256(-1)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function supplyCollateral( + MarketParams memory _marketParams, + uint256 _assets, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + ( + _marketParams, // Updated token contracts in case of Eth + _amt + ) = _performEthToWethConversion( + _marketParams, + _assets, + address(this), + _getId, + Mode.Collateral + ); + + // Approving collateral token + approve( + TokenInterface(_marketParams.collateralToken), + address(MORPHO_BLUE), + _amt + ); + + MORPHO_BLUE.supplyCollateral( + _marketParams, + _amt, + address(this), + new bytes(0) + ); + + setUint(_setId, _amt); + + _eventName = "LogSupplyCollateral((address,address,address,address,unit256),uint256,uint256,uint256)"; + _eventParam = abi.encode(_marketParams, _assets, _getId, _setId); + } + + /** + * @notice Supplies `assets` of collateral on behalf of `onBehalf`, optionally calling back the caller's `onMorphoSupplyCollateral` function with the given `data`. + * @param _marketParams The market to supply assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _assets The amount of assets to supply. (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. + */ + function supplyCollateralOnBehalf( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + // Final assets amount and token contract + ( + _marketParams, // Updated token contracts in case of Eth + _amt + ) = _performEthToWethConversion( + _marketParams, + _assets, + _onBehalf, + _getId, + Mode.Collateral + ); + + // Approving collateral token + approve( + TokenInterface(_marketParams.collateralToken), + address(MORPHO_BLUE), + _amt + ); + + MORPHO_BLUE.supplyCollateral( + _marketParams, + _amt, + _onBehalf, + new bytes(0) + ); + + setUint(_setId, _amt); + + _eventName = "LogSupplyCollateralOnBehalf((address,address,address,address,unit256),uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _onBehalf, + _getId, + _setId + ); + } + + /** + * @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)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function withdrawCollateral( + MarketParams memory _marketParams, + uint256 _assets, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _assets); + + _marketParams = updateTokenAddresses(_marketParams); + + // If amount is max, fetch collateral value from Morpho's contract + if (_amt == type(uint256).max) { + Id _id = _marketParams.id(); + Position memory _pos = MORPHO_BLUE.position(_id, address(this)); + _amt = _pos.collateral; + } + + MORPHO_BLUE.withdrawCollateral( + _marketParams, + _amt, + address(this), + address(this) + ); + + convertWethToEth( + _marketParams.collateralToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); + + setUint(_setId, _amt); + + _eventName = "LogWithdrawCollateral((address,address,address,address,unit256),uint256,uint256,uint256)"; + _eventParam = abi.encode(_marketParams, _amt, _getId, _setId); + } + + /** + * @notice Handles the withdrawal of collateral by a user from a specific market of a specific amount. + * @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)`) + * @param _onBehalf The address that already deposited position. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function withdrawCollateralOnBehalf( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + address _receiver, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _assets); + + _marketParams = updateTokenAddresses(_marketParams); + + // If amount is max, fetch collateral value from Morpho's contract + if (_amt == type(uint256).max) { + Id _id = _marketParams.id(); + Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); + _amt = _pos.collateral; + } + + MORPHO_BLUE.withdrawCollateral( + _marketParams, + _amt, + _onBehalf, + _receiver + ); + + if (_receiver == address(this)) + convertWethToEth( + _marketParams.collateralToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); + + setUint(_setId, _amt); + + _eventName = "LogWithdrawCollateralOnBehalf((address,address,address,address,unit256),uint256,address,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _amt, + _onBehalf, + _receiver, + _getId, + _setId + ); + } + + /** + * @notice Handles the withdrawal of supply. + * @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)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function withdraw( + MarketParams memory _marketParams, + uint256 _assets, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _assets); + + _marketParams = updateTokenAddresses(_marketParams); + + uint256 _shares = 0; + + // Using shares for max amounts to make sure no dust is left on the contract + if (_amt == type(uint256).max) { + Id _id = _marketParams.id(); + Position memory _pos = MORPHO_BLUE.position(_id, address(this)); + _shares = _pos.supplyShares; + _amt = 0; + } + + // In case of max share amount will be used + (_assets, _shares) = MORPHO_BLUE.withdraw( + _marketParams, + _amt, + _shares, + address(this), + address(this) + ); + + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); + + setUint(_setId, _assets); + + _eventName = "LogWithdraw((address,address,address,address,unit256),uint256,uint256,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _getId, + _setId + ); + } + + /** + * @notice Handles the withdrawal of a specified amount of assets by a user from a specific market. + * @dev The market to withdraw assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _marketParams The parameters of the market. + * @param _assets The amount of assets the user is withdrawing. (For max: `uint256(-1)`) + * @param _onBehalf The address who's position to withdraw from. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function withdrawOnBehalf( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + address _receiver, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _assets); + + _marketParams = updateTokenAddresses(_marketParams); + + uint256 _shares = 0; + // Using shares for max amounts to make sure no dust is left on the contract + if (_amt == type(uint256).max) { + Id _id = _marketParams.id(); + Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); + _shares = _pos.supplyShares; + _amt = 0; + } + + (_assets, _shares) = MORPHO_BLUE.withdraw( + _marketParams, + _amt, + _shares, + _onBehalf, + _receiver + ); + + if (_receiver == address(this)) + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); + + setUint(_setId, _assets); + + _eventName = "LogWithdrawOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _onBehalf, + _getId, + _setId + ); + } + + /** + * @notice Handles the withdrawal of a specified amount of assets by a user from a specific market. + * @dev The market to withdraw assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _marketParams The parameters of the market. + * @param _shares The amount of shares the user is withdrawing. (For max: `uint256(-1)`) + * @param _onBehalf The address who's position to withdraw from. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens deposited. + */ + function withdrawSharesOnBehalf( + MarketParams memory _marketParams, + uint256 _shares, + address _onBehalf, + address _receiver, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _shareAmt = getUint(_getId, _shares); + + _marketParams = updateTokenAddresses(_marketParams); + + if (_shareAmt == type(uint256).max) { + Id _id = _marketParams.id(); + Position memory _pos = MORPHO_BLUE.position(_id, _onBehalf); + _shareAmt = _pos.supplyShares; + } + + (uint256 _assets, ) = MORPHO_BLUE.withdraw( + _marketParams, + 0, + _shareAmt, + _onBehalf, + _receiver + ); + + if (_receiver == address(this)) + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); + + setUint(_setId, _assets); + + _eventName = "LogWithdrawOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shareAmt, + _onBehalf, + _getId, + _setId + ); + } + + /** + * @notice Borrows assets. + * @dev The market to borrow assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _marketParams The market to borrow assets from. + * @param _assets The amount of assets to borrow. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens borrowed. + */ + function borrow( + MarketParams memory _marketParams, + uint256 _assets, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _assets); + + _marketParams = updateTokenAddresses(_marketParams); + + (, uint256 _shares) = MORPHO_BLUE.borrow( + _marketParams, + _amt, + 0, + address(this), + address(this) + ); + + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); + + setUint(_setId, _amt); + + _eventName = "LogBorrow((address,address,address,address,unit256),uint256,uint256,uint256,uint256)"; + _eventParam = abi.encode(_marketParams, _amt, _shares, _getId, _setId); + } + + /** + * @notice Borrows `assets` on behalf of `onBehalf` to `receiver`. + * @dev The market to borrow assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _marketParams The market to borrow assets from. + * @param _assets The amount of assets to borrow. + * @param _onBehalf The address that will recieve the borrowing assets and own the borrow position. + * @param _receiver The address that will recieve the borrowed assets. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens borrowed. + */ + function borrowOnBehalf( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + address _receiver, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt = getUint(_getId, _assets); + + _marketParams = updateTokenAddresses(_marketParams); + + (, uint256 _shares) = MORPHO_BLUE.borrow( + _marketParams, + _amt, + 0, + _onBehalf, + _receiver + ); + + if (_receiver == address(this)) + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _amt + ); + + setUint(_setId, _amt); + + _eventName = "LogBorrowOnBehalf((address,address,address,address,unit256),uint256,uint256,address,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _amt, + _shares, + _onBehalf, + _receiver, + _getId, + _setId + ); + } + + /** + * @notice Borrows `shares` on behalf of `onBehalf` to `receiver`. + * @dev The market to borrow assets from. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _marketParams The market to borrow assets from. + * @param _shares The amount of shares to mint. + * @param _onBehalf The address that will own the borrow position. + * @param _receiver The address that will recieve the borrowed assets. + * @param _getId ID to retrieve shares amt. + * @param _setId ID stores the amount of tokens borrowed. + */ + function borrowOnBehalfShares( + MarketParams memory _marketParams, + uint256 _shares, + address _onBehalf, + address _receiver, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _shareAmt = getUint(_getId, _shares); + + _marketParams = updateTokenAddresses(_marketParams); + + (uint256 _assets, ) = MORPHO_BLUE.borrow( + _marketParams, + 0, + _shareAmt, + _onBehalf, + _receiver + ); + + if (_receiver == address(this)) + convertWethToEth( + _marketParams.loanToken == ethAddr, + TokenInterface(wethAddr), + _assets + ); + + setUint(_setId, _assets); + + _eventName = "LogBorrowOnBehalf((address,address,address,address,unit256),uint256,uint256,address,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shareAmt, + _onBehalf, + _receiver, + _getId, + _setId + ); + } + + /** + * @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)`) + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens repaid. + */ + function repay( + MarketParams memory _marketParams, + uint256 _assets, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + ( + _marketParams, // Updated token contracts in case of Eth + _amt // Assets final amount to repay + ) = _performEthToWethConversion( + _marketParams, + _assets, + address(this), + _getId, + Mode.Repay + ); + + // Approving loan token for repaying + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); + + uint256 _shares; + (_assets, _shares) = MORPHO_BLUE.repay( + _marketParams, + _amt, + 0, + address(this), + new bytes(0) + ); + + setUint(_setId, _assets); + + _eventName = "LogRepay((address,address,address,address,unit256),uint256,uint256,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _getId, + _setId + ); + } + + /** + * @notice Repays assets on behalf. + * @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)`) + * @param _onBehalf The address whose loan will be repaid. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens repaid. + */ + function repayOnBehalf( + MarketParams memory _marketParams, + uint256 _assets, + address _onBehalf, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _amt; + ( + _marketParams, // Updated token contracts in case of Eth + _amt // Assets final amount to repay + ) = _performEthToWethConversion( + _marketParams, + _assets, + _onBehalf, + _getId, + Mode.Repay + ); + + // Approving loan token for repaying + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _amt + ); + + uint256 _shares; + (_assets, _shares) = MORPHO_BLUE.repay( + _marketParams, + _amt, + 0, + _onBehalf, + new bytes(0) + ); + + setUint(_setId, _assets); + + _eventName = "LogRepayOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _onBehalf, + _getId, + _setId + ); + } + + /** + * @notice Repays shares on behalf. + * @dev The market to repay assets to. (For ETH: 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE) + * @param _marketParams The market to repay assets to. + * @param _shares The amount of shares to burn. (For max: `uint256(-1)`) + * @param _onBehalf The address whose loan will be repaid. + * @param _getId ID to retrieve amt. + * @param _setId ID stores the amount of tokens repaid. + */ + function repayOnBehalfShares( + MarketParams memory _marketParams, + uint256 _shares, + address _onBehalf, + uint256 _getId, + uint256 _setId + ) + external + payable + returns (string memory _eventName, bytes memory _eventParam) + { + uint256 _assetsAmt; + ( + _marketParams, // Updated token contracts in case of Eth + _assetsAmt // Assets final amount to repay + ) = _performEthToWethSharesConversion( + _marketParams, + _shares, + _onBehalf, + _getId, + true + ); + + approve( + TokenInterface(_marketParams.loanToken), + address(MORPHO_BLUE), + _assetsAmt + ); + + (uint256 _assets, ) = MORPHO_BLUE.repay( + _marketParams, + _assetsAmt, + 0, + _onBehalf, + new bytes(0) + ); + + setUint(_setId, _assets); + + _eventName = "LogRepayOnBehalf((address,address,address,address,unit256),uint256,uint256,address,uint256,uint256)"; + _eventParam = abi.encode( + _marketParams, + _assets, + _shares, + _onBehalf, + _getId, + _setId + ); + } } contract ConnectV2MorphoBlue is MorphoBlue { - string public constant name = "Morpho-Blue-v1.0"; + string public constant name = "Morpho-Blue-v1.0"; }