mirror of
https://github.com/Instadapp/dsa-connectors.git
synced 2024-07-29 22:37:00 +00:00
feat: update morpho blue contracts
This commit is contained in:
parent
3bba96ff3f
commit
332d160830
|
@ -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
|
||||||
);
|
);
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue
Block a user