feat: update morpho blue contracts

This commit is contained in:
Shriya Tyagi 2023-12-09 20:02:05 +05:30
parent 3bba96ff3f
commit 332d160830
4 changed files with 805 additions and 403 deletions

View File

@ -1,40 +1,140 @@
//SPDX-License-Identifier: MIT //SPDX-License-Identifier: MIT
pragma solidity ^0.7.0; pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
import "./interface.sol";
contract Events { contract Events {
event LogSupply( event LogSupplyAssets(
address loanToken, address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 assets,
uint256 shares,
uint256 getId,
uint256 setId
);
event LogSupplyAssetsOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 assets,
uint256 shares,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogSupplySharesOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 assets, uint256 assets,
uint256 shares, uint256 shares,
address onBehalf, address onBehalf,
bytes data,
uint256 getId, uint256 getId,
uint256 setId uint256 setId
); );
event LogSupplyCollateral( event LogSupplyCollateral(
address loanToken, address loanToken,
address poolTokenAddress, address collateralToken,
uint256 amount, address oracle,
uint256 maxGasForMatching, address irm,
uint256 lltv,
uint256 assets,
uint256 getId,
uint256 setId
);
event LogSupplyCollateralOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 assets,
address onBehalf,
uint256 getId, uint256 getId,
uint256 setId uint256 setId
); );
event LogBorrow( event LogBorrow(
address loanToken, address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts,
uint256 shares,
uint256 getId,
uint256 setId
);
event LogBorrowOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts, uint256 amounts,
uint256 shares, uint256 shares,
address onBehalf, address onBehalf,
address reciever,
uint256 getId,
uint256 setId
);
event LogBorrowShares(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts,
uint256 shares,
address onBehalf,
address reciever,
uint256 getId, uint256 getId,
uint256 setId uint256 setId
); );
event LogWithdraw( event LogWithdraw(
address loanToken, address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts, uint256 amounts,
uint256 getId,
uint256 setId
);
event LogWithdrawOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogWithdrawSharesOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 shares, uint256 shares,
address onBehalf, address onBehalf,
uint256 getId, uint256 getId,
@ -43,18 +143,62 @@ contract Events {
event LogWithdrawCollateral( event LogWithdrawCollateral(
address loanToken, address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts,
uint256 getId,
uint256 setId
);
event LogWithdrawCollateralOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts, uint256 amounts,
address onBehalf, address onBehalf,
address reciever,
uint256 getId, uint256 getId,
uint256 setId uint256 setId
); );
event LogPayback( event LogPayback(
address loanToken, address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts,
uint256 shares,
uint256 getId,
uint256 setId
);
event LogPaybackOnBehalf(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts,
uint256 shares,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogPaybackShares(
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv,
uint256 amounts, uint256 amounts,
uint256 shares, uint256 shares,
address onBehalf, address onBehalf,
bytes data,
uint256 getId, uint256 getId,
uint256 setId uint256 setId
); );

View File

@ -10,31 +10,11 @@ import "../../common/interfaces.sol";
abstract contract Helpers is Stores, Basic { abstract contract Helpers is Stores, Basic {
IMorpho public constant MORPHO_BLUE = IMorpho public constant MORPHO_BLUE =
IMorpho(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0); IMorpho(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0); // TODO: Update
function _performEthToWethConversion(
address _tokenAddress,
uint256 _amount,
uint256 _getId
) internal returns (TokenInterface _tokenContract, uint256 _amt, bool _isMax) {
_amt = getUint(_getId, _amount);
_isMax = _amt == uint256(-1);
if (_tokenAddress == ethAddr) {
_tokenContract = TokenInterface(wethAddr);
if (_amt == uint256(-1)) _amt = address(this).balance;
convertEthToWeth(true, _tokenContract, _amt);
} else {
_tokenContract = TokenInterface(_tokenAddress);
if (_amt == uint256(-1)) _amt = _tokenContract.balanceOf(address(this));
}
}
uint256 internal constant MARKET_PARAMS_BYTES_LENGTH = 5 * 32; uint256 internal constant MARKET_PARAMS_BYTES_LENGTH = 5 * 32;
/// @dev A number of virtual assets of 1 enforces a conversion rate between shares and assets when a market is /// @dev The number of virtual assets of 1 enforces a conversion rate between shares and assets when a market is
/// empty. /// empty.
uint256 internal constant VIRTUAL_ASSETS = 1; uint256 internal constant VIRTUAL_ASSETS = 1;
@ -42,6 +22,87 @@ abstract contract Helpers is Stores, Basic {
/// high precision computations. /// high precision computations.
uint256 internal constant VIRTUAL_SHARES = 1e6; uint256 internal constant VIRTUAL_SHARES = 1e6;
/// @notice Handles Eth to Weth conversion if assets are provided.
function _performEthToWethConversion(
MarketParams memory _marketParams,
uint256 _assets,
address _onBehalf,
uint256 _getId,
bool _isCollateral,
bool _isRepay
) internal returns (TokenInterface _tokenContract, uint256 _amt) {
_amt = getUint(_getId, _assets);
bool _isEth = _isCollateral ? _marketParams.collateralToken == ethAddr : _marketParams.loanToken == ethAddr;
// Set the correct token contract
_tokenContract = _isEth ? TokenInterface(wethAddr) : TokenInterface(_marketParams.loanToken);
// Check for max value
if (_assets == type(uint256).max) {
uint256 _maxAvailable = _isEth ? address(this).balance : _tokenContract.balanceOf(address(this));
if (_isRepay) {
uint256 _amtDebt = getPaybackBalance(_marketParams, _onBehalf);
_amt = min(_maxAvailable, _amtDebt);
} else {
_amt = _maxAvailable;
}
}
// Perform conversion if necessary
if (_isEth) {
convertEthToWeth(true, _tokenContract, _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 (TokenInterface _tokenContract, 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);
// Handle the max share case or normal share conversion
if (_isRepay && _shares == type(uint256).max) {
uint256 _maxAvailable = _isEth ? address(this).balance : _tokenContract.balanceOf(address(this));
_assets = min(_maxAvailable, getPaybackBalance(_marketParams, _onBehalf));
} else {
bytes32 _id = id(_marketParams);
_assets = _toAssetsUp(_shareAmt, MORPHO_BLUE.market(_id).totalSupplyAssets, MORPHO_BLUE.market(_id).totalSupplyShares);
}
// Perform ETH to WETH conversion if necessary
if (_isEth) {
convertEthToWeth(true, _tokenContract, _assets);
}
}
/// @notice Helper function to find the minimum of two values
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/// @notice Returns the payback balance in assets.
function getPaybackBalance(MarketParams memory _marketParams, address _onBehalf) internal view returns(uint256 _assets) {
bytes32 _id = id(_marketParams);
uint256 _shareAmt = MORPHO_BLUE.position(_id, _onBehalf).supplyShares;
_assets =
_toAssetsUp(
_shareAmt,
MORPHO_BLUE.market(_id).totalSupplyAssets,
MORPHO_BLUE.market(_id).totalSupplyShares
);
}
/// @notice Returns the id of the market `marketParams`. /// @notice Returns the id of the market `marketParams`.
function id(MarketParams memory marketParams) internal pure returns (bytes32 marketParamsId) { function id(MarketParams memory marketParams) internal pure returns (bytes32 marketParamsId) {
assembly { assembly {
@ -49,17 +110,13 @@ abstract contract Helpers is Stores, Basic {
} }
} }
/// @dev Calculates the value of `shares` quoted in assets, rounding up. /// @notice Calculates the value of `shares` quoted in assets, rounding up.
function _toAssetsUp(uint256 _shares, uint256 _totalAssets, uint256 _totalShares) internal pure returns (uint256) { function _toAssetsUp(uint256 _shares, uint256 _totalAssets, uint256 _totalShares) internal pure returns (uint256) {
return _mulDivUp(_shares, _totalAssets + VIRTUAL_ASSETS, _totalShares + VIRTUAL_SHARES); return _mulDivUp(_shares, _totalAssets + VIRTUAL_ASSETS, _totalShares + VIRTUAL_SHARES);
} }
/// @dev Returns (`x` * `y`) / `d` rounded up. /// @notice Returns (`x` * `y`) / `d` rounded up.
function _mulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) { function _mulDivUp(uint256 x, uint256 y, uint256 d) internal pure returns (uint256) {
return (x * y + (d - 1)) / d; return (x * y + (d - 1)) / d;
} }
function _getApproveAmount(bytes32 _id, uint256 _assets, uint256 _shares) internal view returns (uint256 _amount) {
_amount == 0 ? _assets = _toAssetsUp(_shares, MORPHO_BLUE.market(_id).totalSupplyAssets, MORPHO_BLUE.market(_id).totalSupplyShares) : _assets;
}
} }

View File

@ -2,8 +2,6 @@
pragma solidity ^0.7.0; pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2; pragma experimental ABIEncoderV2;
// type Id is bytes32;
struct MarketParams { struct MarketParams {
address loanToken; address loanToken;
address collateralToken; address collateralToken;

File diff suppressed because it is too large Load Diff