Skip to content

Commit 3bac0e4

Browse files
committed
fix: use IERC4626 instead of the euler specific one
1 parent b289fbf commit 3bac0e4

File tree

4 files changed

+22
-620
lines changed

4 files changed

+22
-620
lines changed

src/asset-management/EulerV2Manager.sol

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,24 @@ import { Address } from "@openzeppelin/utils/Address.sol";
1010

1111
import { IAssetManagedPair } from "src/interfaces/IAssetManagedPair.sol";
1212
import { IAssetManager, IERC20 } from "src/interfaces/IAssetManager.sol";
13-
import { IEVault } from "src/interfaces/euler/IEvault.sol";
13+
import { IERC4626 } from "lib/forge-std/src/interfaces/IERC4626.sol";
1414

1515
contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
1616
using FixedPointMathLib for uint256;
1717
using SafeCast for uint256;
1818

1919
event Guardian(address newGuardian);
2020
event WindDownMode(bool windDown);
21-
event VaultForAsset(IERC20 asset, IEVault vault);
21+
event VaultForAsset(IERC20 asset, IERC4626 vault);
2222
event Thresholds(uint128 newLowerThreshold, uint128 newUpperThreshold);
2323
event Investment(IAssetManagedPair pair, IERC20 token, uint256 shares);
2424
event Divestment(IAssetManagedPair pair, IERC20 token, uint256 shares);
2525

26-
/// @dev Mapping from ERC20 asset to an Euler vault.
27-
/// This implies that for a given asset, there can only be one vault
28-
mapping(IERC20 => IEVault) public assetVault;
26+
/// @dev Mapping from an ERC20 token to an Euler V2 vault.
27+
/// This implies that for a given asset, there can only be one vault.
28+
/// If the admin of the manager wishes to specify a different vault for an asset, they would have to manually ensure that all pairs have
29+
/// divested, otherwise the pairs might not be able to retrieve their assets.
30+
mapping(IERC20 => IERC4626) public assetVault;
2931

3032
/// @dev tracks how many shares each pair+token owns
3133
mapping(IAssetManagedPair => mapping(IERC20 => uint256)) public shares;
@@ -45,8 +47,8 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
4547
/// the pairs in this mode to facilitate replacement of asset managers to newer versions
4648
bool public windDownMode;
4749

48-
constructor() {
49-
}
50+
// solhint-disable-next-line no-empty-blocks
51+
constructor() { }
5052

5153
/*//////////////////////////////////////////////////////////////////////////
5254
MODIFIERS
@@ -61,7 +63,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
6163
ADMIN ACTIONS
6264
//////////////////////////////////////////////////////////////////////////*/
6365

64-
function setVaultForAsset(IERC20 aAsset, IEVault aVault) external onlyOwner {
66+
function setVaultForAsset(IERC20 aAsset, IERC4626 aVault) external onlyOwner {
6567
// what happens if there was already a vault set?
6668

6769
assetVault[aAsset] = aVault;
@@ -95,7 +97,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
9597
HELPER FUNCTIONS
9698
//////////////////////////////////////////////////////////////////////////*/
9799

98-
function _increaseShares(IAssetManagedPair aPair, IERC20 aToken, IEVault aVault, uint256 aAmount)
100+
function _increaseShares(IAssetManagedPair aPair, IERC20 aToken, IERC4626 aVault, uint256 aAmount)
99101
private
100102
returns (uint256 rShares)
101103
{
@@ -105,7 +107,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
105107
shares[aPair][aToken] += rShares;
106108
}
107109

108-
function _decreaseShares(IAssetManagedPair aPair, IERC20 aToken, IEVault aVault, uint256 aAmount)
110+
function _decreaseShares(IAssetManagedPair aPair, IERC20 aToken, IERC4626 aVault, uint256 aAmount)
109111
private
110112
returns (uint256 rShares)
111113
{
@@ -123,7 +125,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
123125
}
124126

125127
function _getBalance(IAssetManagedPair aOwner, IERC20 aToken) private view returns (uint256 rTokenBalance) {
126-
IEVault lVault = assetVault[aToken];
128+
IERC4626 lVault = assetVault[aToken];
127129

128130
// TODO: what happens if something was assigned, and then deassigned?
129131
if (address(lVault) != address(0)) {
@@ -151,8 +153,8 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
151153
IERC20 lToken0 = aPair.token0();
152154
IERC20 lToken1 = aPair.token1();
153155

154-
IEVault lToken0Vault = assetVault[lToken0];
155-
IEVault lToken1Vault = assetVault[lToken1];
156+
IERC4626 lToken0Vault = assetVault[lToken0];
157+
IERC4626 lToken1Vault = assetVault[lToken1];
156158

157159
// do not do anything if there isn't a market for the token
158160
// TODO: what if there is still remaining outstanding balance, but the mapping is set to 0?
@@ -200,25 +202,24 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
200202
}
201203
}
202204

203-
function _doDivest(IAssetManagedPair aPair, IERC20 aToken, IEVault aVault, uint256 aAmount) private {
205+
function _doDivest(IAssetManagedPair aPair, IERC20 aToken, IERC4626 aVault, uint256 aAmount) private {
204206
uint256 lShares = _decreaseShares(aPair, aToken, aVault, aAmount);
205207
uint256 lSharesBurned = aVault.withdraw(aAmount, address(this), address(this));
206208

207-
// N.B: sometimes lShares and lSharesBurned can be off by 1, even if aAmount is the exact same
208-
require(lShares == lSharesBurned, "divest Shares mismatch");
209+
require(lShares == lSharesBurned, "AM: DIVEST_SHARES_MISMATCH");
209210

210211
emit Divestment(aPair, aToken, lShares);
211212
SafeTransferLib.safeApprove(address(aToken), address(aPair), aAmount);
212213
}
213214

214-
function _doInvest(IAssetManagedPair aPair, IERC20 aToken, IEVault aVault, uint256 aAmount) private {
215+
function _doInvest(IAssetManagedPair aPair, IERC20 aToken, IERC4626 aVault, uint256 aAmount) private {
215216
require(aToken.balanceOf(address(this)) == aAmount, "AM: TOKEN_AMOUNT_MISMATCH");
216217
uint256 lExpectedShares = _increaseShares(aPair, aToken, aVault, aAmount);
217218
SafeTransferLib.safeApprove(address(aToken), address(aVault), aAmount);
218219

219220
uint256 lSharesReceived = aVault.deposit(aAmount, address(this));
220221

221-
require(lExpectedShares == lSharesReceived, "invest shares mismatch");
222+
require(lExpectedShares == lSharesReceived, "AM: INVEST_SHARES_MISMATCH");
222223

223224
emit Investment(aPair, aToken, lSharesReceived);
224225
}

0 commit comments

Comments
 (0)