Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/leveraged steth #159

Merged
merged 33 commits into from
Mar 28, 2024
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
33 commits
Select commit Hold shift + click to select a range
8b41dfe
Add levereged wstETH adapter
Andreadinenno Feb 29, 2024
6396941
Fix ltv calculation
Andreadinenno Feb 29, 2024
6b8be44
Fix deposit and leverage bugs. Add deposit flow tests
Andreadinenno Mar 1, 2024
b4b3444
Refactor initialization. Rename lendingPool
Andreadinenno Mar 1, 2024
715f8ce
Use flashloans to leverage up and down
Andreadinenno Mar 5, 2024
aa6cbe7
Derive amount to flash loan on chain
Andreadinenno Mar 5, 2024
cae3f9c
Fix amount calculation in withdraw
Andreadinenno Mar 6, 2024
e4326c5
Add max LTV param, fix total assets and full withdrawals
Andreadinenno Mar 6, 2024
f971a22
Use dust ETH when leveraging, add func to withdraw dust. Format code
Andreadinenno Mar 8, 2024
7a881c7
Tests - wip
Andreadinenno Mar 8, 2024
ff92830
Fix withdraw bug
Andreadinenno Mar 11, 2024
d31ff99
Split tests and improve
Andreadinenno Mar 11, 2024
47370e9
init
RedVeil Mar 13, 2024
8c2a2d8
small cleanup
RedVeil Mar 13, 2024
2fb0e75
reordered function + added mangement functions
RedVeil Mar 13, 2024
dd03123
added admin functions
RedVeil Mar 14, 2024
b680c80
added admin call in test
RedVeil Mar 14, 2024
fd49f1d
Fix total assets
Andreadinenno Mar 14, 2024
9dd16c4
test setLeverageValues
RedVeil Mar 15, 2024
b66a06a
Merge branch 'feat/leveraged-steth' into suggestions/lever-wstETH
RedVeil Mar 15, 2024
f7b44d9
Merge pull request #163 from Popcorn-Limited/suggestions/lever-wstETH
RedVeil Mar 15, 2024
b264bc7
Add initiator and sender checks on flash loan callback
Andreadinenno Mar 18, 2024
f2bd91a
Set weth and stETH constant values
Andreadinenno Mar 18, 2024
bc1ed45
Remove commented aave addresses
Andreadinenno Mar 18, 2024
13ac7c0
Remove unused import. Fix comments
Andreadinenno Mar 18, 2024
b34f22d
Fix bug on accounting dust
Andreadinenno Mar 18, 2024
4e798f2
Add morpho adapter - wip
Andreadinenno Mar 18, 2024
30daf39
Add stETH to ETH ratio when accounting
Andreadinenno Mar 19, 2024
a46abb2
Add inceasePricePerShare in test
Andreadinenno Mar 20, 2024
44a1a09
Add stETH to ETH rate
Andreadinenno Mar 20, 2024
6964911
Enable user eMode. Add slippage setter
Andreadinenno Mar 20, 2024
fd9f961
Remove morpho adapters, out of scope now
Andreadinenno Mar 20, 2024
718f328
Add harvest func
Andreadinenno Mar 21, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 17 additions & 14 deletions src/vault/adapter/lido/LeveragedWstETHAdapter.sol
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import {IwstETH} from "./IwstETH.sol";
import {Math} from "openzeppelin-contracts/utils/math/Math.sol";
import {IWETH} from "../../../interfaces/external/IWETH.sol";
import {ICurveMetapool} from "../../../interfaces/external/curve/ICurveMetapool.sol";
import {ILendingPool, IAaveIncentives, IAToken, IFlashLoanReceiver, IProtocolDataProvider, DataTypes, IPoolAddressesProvider} from "../aave/aaveV3/IAaveV3.sol";
import {ILendingPool, IAToken, IFlashLoanReceiver, IProtocolDataProvider, IPoolAddressesProvider} from "../aave/aaveV3/IAaveV3.sol";

/// @title Leveraged wstETH yield adapter
/// @author Andrea Di Nenno
Expand All @@ -27,7 +27,9 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
ILendingPool public lendingPool;
IPoolAddressesProvider public poolAddressesProvider;

IWETH public weth;
IWETH public constant weth = IWETH(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2);
address public constant stETH = address(0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84);

IERC20 public debtToken; // aave eth debt token
IERC20 public interestToken; // aave awstETH
0xruhum marked this conversation as resolved.
Show resolved Hide resolved

Expand All @@ -52,8 +54,6 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
* @param adapterInitData Encoded data for the base adapter initialization.
* @param _initData Encoded data for the adapter initialization.
* @dev `_slippage` - allowed slippage in 1e18
* @dev `_weth` - Weth address.
* @dev `_stEth` - stETH address.
* @dev `_poolAddressesProvider` - aave Pool Addresses Provider contract address.
* @dev `_targetLTV` - The desired loan to value of the vault CDP.
* @dev `_maxLTV` - The max loan to value allowed before a automatic de-leverage
Expand All @@ -67,15 +67,13 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
__AdapterBase_init(adapterInitData);

(
address _wETH,
address _stETH,
address _poolAddressesProvider,
uint256 _slippage,
uint256 _targetLTV,
uint256 _maxLTV
) = abi.decode(
_initData,
(address, address, address, uint256, uint256, uint256)
(address, uint256, uint256, uint256)
);

address baseAsset = asset();
Expand All @@ -84,7 +82,6 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
maxLTV = _maxLTV;

slippage = _slippage;
weth = IWETH(_wETH);

// retrieve and set wstETH aToken, lending pool
(address _aToken, , ) = IProtocolDataProvider(aaveDataProvider)
Expand All @@ -97,7 +94,8 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
// retrieve and set WETH variable debt token
(, , address _variableDebtToken) = IProtocolDataProvider(
aaveDataProvider
).getReserveTokensAddresses(_wETH);
).getReserveTokensAddresses(address(weth));

debtToken = IERC20(_variableDebtToken); // variable debt WETH token

_name = string.concat(
Expand All @@ -114,7 +112,7 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
IERC20(address(weth)).approve(address(lendingPool), type(uint256).max);

// approve curve router to pull stETH for swapping
IERC20(address(_stETH)).approve(
IERC20(stETH).approve(
address(StableSwapSTETH),
type(uint256).max
);
Expand Down Expand Up @@ -172,6 +170,8 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
/*//////////////////////////////////////////////////////////////
FLASH LOAN LOGIC
//////////////////////////////////////////////////////////////*/

error NotFlashLoan();

function ADDRESSES_PROVIDER()
external
Expand All @@ -193,6 +193,9 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
address initiator,
bytes calldata params
) external override returns (bool) {
if(initiator != address(this) && msg.sender != address(lendingPool))
revert NotFlashLoan();

(bool isWithdraw, bool isFullWithdraw, uint256 assetsToWithdraw) = abi
.decode(params, (bool, bool, uint256));

Expand Down Expand Up @@ -269,16 +272,16 @@ contract LeveragedWstETHAdapter is AdapterBase, IFlashLoanReceiver {
address wstETH = asset();

// account for eventual eth dust
borrowAmount += address(this).balance;
uint256 ethDust = address(this).balance;

// unwrap into ETH
weth.withdraw(borrowAmount);

// get amount of wstETH the vault receives
uint256 wstETHAmount = IwstETH(wstETH).getWstETHByStETH(borrowAmount);
uint256 wstETHAmount = IwstETH(wstETH).getWstETHByStETH(borrowAmount + ethDust);

// stake borrowed eth and receive wstETH
(bool sent, ) = wstETH.call{value: borrowAmount}("");
(bool sent, ) = wstETH.call{value: borrowAmount + ethDust}("");
require(sent, "Fail to send eth to wstETH");

// deposit wstETH into lending protocol
Expand Down
68 changes: 68 additions & 0 deletions src/vault/adapter/morpho/IMorpho.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
// SPDX-License-Identifier: GPL-3.0

pragma solidity ^0.8.15;

struct MarketParams {
address loanToken;
address collateralToken;
address oracle;
address irm;
uint256 lltv;
}

interface IMorpho {
function supply(
MarketParams memory marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
bytes memory data
) external returns (uint256 assetsSupplied, uint256 sharesSupplied);

function withdraw(
MarketParams memory marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
address receiver
) external returns (uint256 assetsWithdrawn, uint256 sharesWithdrawn);

function borrow(
MarketParams memory marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
address receiver
) external returns (uint256 assetsBorrowed, uint256 sharesBorrowed);

function repay(
MarketParams memory marketParams,
uint256 assets,
uint256 shares,
address onBehalf,
bytes memory data
) external returns (uint256 assetsRepaid, uint256 sharesRepaid);

function flashLoan(address token, uint256 assets, bytes calldata data) external;

function idToMarketParams(bytes32 id)
external
view
returns (
address loanToken,
address collateralToken,
address oracle,
address irm,
uint256 lltv
);
}

/// @title IMorphoFlashLoanCallback
/// @notice Interface that users willing to use `flashLoan`'s callback must implement.
interface IMorphoFlashLoanCallback {
/// @notice Callback called when a flash loan occurs.
/// @dev The callback is called only if data is not empty.
/// @param assets The amount of assets that was flash loaned.
/// @param data Arbitrary data passed to the `flashLoan` function.
function onMorphoFlashLoan(uint256 assets, bytes calldata data) external;
}
Loading
Loading