Merge pull request #322 from Instadapp/morpho-blue-dev

Morpho blue dev
This commit is contained in:
Shriya Tyagi 2023-12-10 00:14:32 +05:30 committed by GitHub
commit 3bde97733d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 756 additions and 386 deletions

View File

@ -1,60 +1,140 @@
//SPDX-License-Identifier: MIT
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
import "./interface.sol";
contract Events {
event LogSupply(
address loanToken,
event LogSupplyAssets(
MarketParams marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
bytes data,
uint256 getId,
uint256 setId
);
event LogSupplyCollateral(
address loanToken,
address poolTokenAddress,
uint256 amount,
uint256 maxGasForMatching,
uint256 getId,
uint256 setId
);
event LogBorrow(
address loanToken,
uint256 amounts,
uint256 shares,
event LogSupplyAssetsOnBehalf(
MarketParams marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogWithdraw(
address loanToken,
event LogSupplySharesOnBehalf(
MarketParams marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
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 LogBorrow(
MarketParams marketParams,
uint256 amounts,
uint256 shares,
uint256 getId,
uint256 setId
);
event LogBorrowOnBehalf(
MarketParams marketParams,
uint256 amounts,
uint256 shares,
address onBehalf,
address reciever,
uint256 getId,
uint256 setId
);
event LogBorrowShares(
MarketParams marketParams,
uint256 amounts,
uint256 shares,
address onBehalf,
address reciever,
uint256 getId,
uint256 setId
);
event LogWithdraw(
MarketParams marketParams,
uint256 amounts,
uint256 getId,
uint256 setId
);
event LogWithdrawOnBehalf(
MarketParams marketParams,
uint256 amounts,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogWithdrawSharesOnBehalf(
MarketParams marketParams,
uint256 shares,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogWithdrawCollateral(
address loanToken,
MarketParams marketParams,
uint256 amounts,
uint256 getId,
uint256 setId
);
event LogWithdrawCollateralOnBehalf(
MarketParams marketParams,
uint256 amounts,
address onBehalf,
address reciever,
uint256 getId,
uint256 setId
);
event LogPayback(
address loanToken,
MarketParams marketParams,
uint256 amounts,
uint256 shares,
uint256 getId,
uint256 setId
);
event LogPaybackOnBehalf(
MarketParams marketParams,
uint256 amounts,
uint256 shares,
address onBehalf,
uint256 getId,
uint256 setId
);
event LogPaybackShares(
MarketParams marketParams,
uint256 amounts,
uint256 shares,
address onBehalf,
bytes data,
uint256 getId,
uint256 setId
);

View File

@ -10,29 +10,98 @@ import "../../common/interfaces.sol";
abstract contract Helpers is Stores, Basic {
IMorpho public constant MORPHO_BLUE =
IMorpho(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0);
IMorpho(0x777777c9898D384F785Ee44Acfe945efDFf5f3E0); // TODO: Update
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 shares has been chosen low enough to prevent overflows, and high enough to ensure
/// high precision computations.
uint256 internal constant VIRTUAL_SHARES = 1e6;
/// @notice Handles Eth to Weth conversion if assets are provided.
function _performEthToWethConversion(
address _tokenAddress,
uint256 _amount,
uint256 _getId
) internal returns (TokenInterface _tokenContract, uint256 _amt, bool _isMax) {
_amt = getUint(_getId, _amount);
_isMax = _amt == uint256(-1);
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;
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));
// 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);
}
}
uint256 internal constant MARKET_PARAMS_BYTES_LENGTH = 5 * 32;
/// @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`.
function id(MarketParams memory marketParams) internal pure returns (bytes32 marketParamsId) {
@ -40,4 +109,14 @@ abstract contract Helpers is Stores, Basic {
marketParamsId := keccak256(marketParams, MARKET_PARAMS_BYTES_LENGTH)
}
}
/// @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);
}
/// @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;
}
}

View File

@ -2,8 +2,6 @@
pragma solidity ^0.7.0;
pragma experimental ABIEncoderV2;
// type Id is bytes32;
struct MarketParams {
address loanToken;
address collateralToken;
@ -20,6 +18,19 @@ struct Position {
uint128 collateral;
}
/// @dev Warning: `totalSupplyAssets` does not contain the accrued interest since the last interest accrual.
/// @dev Warning: `totalBorrowAssets` does not contain the accrued interest since the last interest accrual.
/// @dev Warning: `totalSupplyShares` does not contain the additional shares accrued by `feeRecipient` since the last
/// interest accrual.
struct Market {
uint128 totalSupplyAssets;
uint128 totalSupplyShares;
uint128 totalBorrowAssets;
uint128 totalBorrowShares;
uint128 lastUpdate;
uint128 fee;
}
interface IMorpho {
function createMarket(MarketParams memory marketParams) external;
@ -61,5 +72,7 @@ interface IMorpho {
function withdrawCollateral(MarketParams memory marketParams, uint256 assets, address onBehalf, address receiver) external;
function position(bytes32 id, address user) external view returns(Position memory);
function market(bytes32 id) external view returns(Market memory);
}

File diff suppressed because it is too large Load Diff