feat: update common logics

This commit is contained in:
Shriya Tyagi 2023-12-11 23:36:55 +05:30
parent 9bf8613bf6
commit 9b8c7db025
2 changed files with 222 additions and 207 deletions

View File

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

View File

@ -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,