@@ -10,22 +10,24 @@ import { Address } from "@openzeppelin/utils/Address.sol";
10
10
11
11
import { IAssetManagedPair } from "src/interfaces/IAssetManagedPair.sol " ;
12
12
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 " ;
14
14
15
15
contract EulerV2Manager is IAssetManager , Owned (msg .sender ), ReentrancyGuard {
16
16
using FixedPointMathLib for uint256 ;
17
17
using SafeCast for uint256 ;
18
18
19
19
event Guardian (address newGuardian );
20
20
event WindDownMode (bool windDown );
21
- event VaultForAsset (IERC20 asset , IEVault vault );
21
+ event VaultForAsset (IERC20 asset , IERC4626 vault );
22
22
event Thresholds (uint128 newLowerThreshold , uint128 newUpperThreshold );
23
23
event Investment (IAssetManagedPair pair , IERC20 token , uint256 shares );
24
24
event Divestment (IAssetManagedPair pair , IERC20 token , uint256 shares );
25
25
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;
29
31
30
32
/// @dev tracks how many shares each pair+token owns
31
33
mapping (IAssetManagedPair => mapping (IERC20 => uint256 )) public shares;
@@ -45,8 +47,8 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
45
47
/// the pairs in this mode to facilitate replacement of asset managers to newer versions
46
48
bool public windDownMode;
47
49
48
- constructor () {
49
- }
50
+ // solhint-disable-next-line no-empty-blocks
51
+ constructor () { }
50
52
51
53
/*//////////////////////////////////////////////////////////////////////////
52
54
MODIFIERS
@@ -61,7 +63,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
61
63
ADMIN ACTIONS
62
64
//////////////////////////////////////////////////////////////////////////*/
63
65
64
- function setVaultForAsset (IERC20 aAsset , IEVault aVault ) external onlyOwner {
66
+ function setVaultForAsset (IERC20 aAsset , IERC4626 aVault ) external onlyOwner {
65
67
// what happens if there was already a vault set?
66
68
67
69
assetVault[aAsset] = aVault;
@@ -95,7 +97,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
95
97
HELPER FUNCTIONS
96
98
//////////////////////////////////////////////////////////////////////////*/
97
99
98
- function _increaseShares (IAssetManagedPair aPair , IERC20 aToken , IEVault aVault , uint256 aAmount )
100
+ function _increaseShares (IAssetManagedPair aPair , IERC20 aToken , IERC4626 aVault , uint256 aAmount )
99
101
private
100
102
returns (uint256 rShares )
101
103
{
@@ -105,7 +107,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
105
107
shares[aPair][aToken] += rShares;
106
108
}
107
109
108
- function _decreaseShares (IAssetManagedPair aPair , IERC20 aToken , IEVault aVault , uint256 aAmount )
110
+ function _decreaseShares (IAssetManagedPair aPair , IERC20 aToken , IERC4626 aVault , uint256 aAmount )
109
111
private
110
112
returns (uint256 rShares )
111
113
{
@@ -123,7 +125,7 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
123
125
}
124
126
125
127
function _getBalance (IAssetManagedPair aOwner , IERC20 aToken ) private view returns (uint256 rTokenBalance ) {
126
- IEVault lVault = assetVault[aToken];
128
+ IERC4626 lVault = assetVault[aToken];
127
129
128
130
// TODO: what happens if something was assigned, and then deassigned?
129
131
if (address (lVault) != address (0 )) {
@@ -151,8 +153,8 @@ contract EulerV2Manager is IAssetManager, Owned(msg.sender), ReentrancyGuard {
151
153
IERC20 lToken0 = aPair.token0 ();
152
154
IERC20 lToken1 = aPair.token1 ();
153
155
154
- IEVault lToken0Vault = assetVault[lToken0];
155
- IEVault lToken1Vault = assetVault[lToken1];
156
+ IERC4626 lToken0Vault = assetVault[lToken0];
157
+ IERC4626 lToken1Vault = assetVault[lToken1];
156
158
157
159
// do not do anything if there isn't a market for the token
158
160
// 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 {
200
202
}
201
203
}
202
204
203
- function _doDivest (IAssetManagedPair aPair , IERC20 aToken , IEVault aVault , uint256 aAmount ) private {
205
+ function _doDivest (IAssetManagedPair aPair , IERC20 aToken , IERC4626 aVault , uint256 aAmount ) private {
204
206
uint256 lShares = _decreaseShares (aPair, aToken, aVault, aAmount);
205
207
uint256 lSharesBurned = aVault.withdraw (aAmount, address (this ), address (this ));
206
208
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 " );
209
210
210
211
emit Divestment (aPair, aToken, lShares);
211
212
SafeTransferLib.safeApprove (address (aToken), address (aPair), aAmount);
212
213
}
213
214
214
- function _doInvest (IAssetManagedPair aPair , IERC20 aToken , IEVault aVault , uint256 aAmount ) private {
215
+ function _doInvest (IAssetManagedPair aPair , IERC20 aToken , IERC4626 aVault , uint256 aAmount ) private {
215
216
require (aToken.balanceOf (address (this )) == aAmount, "AM: TOKEN_AMOUNT_MISMATCH " );
216
217
uint256 lExpectedShares = _increaseShares (aPair, aToken, aVault, aAmount);
217
218
SafeTransferLib.safeApprove (address (aToken), address (aVault), aAmount);
218
219
219
220
uint256 lSharesReceived = aVault.deposit (aAmount, address (this ));
220
221
221
- require (lExpectedShares == lSharesReceived, "invest shares mismatch " );
222
+ require (lExpectedShares == lSharesReceived, "AM: INVEST_SHARES_MISMATCH " );
222
223
223
224
emit Investment (aPair, aToken, lSharesReceived);
224
225
}
0 commit comments