@@ -12,8 +12,7 @@ contract EulerSwapPeriphery is IEulerSwapPeriphery {
12
12
13
13
error UnsupportedPair ();
14
14
error OperatorNotInstalled ();
15
- error InsufficientReserves ();
16
- error InsufficientCash ();
15
+ error SwapLimitExceeded ();
17
16
error AmountOutLessThanMin ();
18
17
error AmountInMoreThanMax ();
19
18
@@ -93,27 +92,25 @@ contract EulerSwapPeriphery is IEulerSwapPeriphery {
93
92
IEVC (eulerSwap.EVC ()).isAccountOperatorAuthorized (eulerSwap.eulerAccount (), address (eulerSwap)),
94
93
OperatorNotInstalled ()
95
94
);
95
+ require (amount <= type (uint112 ).max, SwapLimitExceeded ());
96
96
97
97
uint256 feeMultiplier = eulerSwap.feeMultiplier ();
98
- address vault0 = eulerSwap.vault0 ();
99
- address vault1 = eulerSwap.vault1 ();
100
98
(uint112 reserve0 , uint112 reserve1 ,) = eulerSwap.getReserves ();
101
99
102
100
// exactIn: decrease received amountIn, rounding down
103
101
if (exactIn) amount = amount * feeMultiplier / 1e18 ;
104
102
105
103
bool asset0IsInput = checkTokens (eulerSwap, tokenIn, tokenOut);
104
+ (uint256 inLimit , uint256 outLimit ) = _getLimits (eulerSwap, asset0IsInput);
106
105
107
106
uint256 quote = binarySearch (eulerSwap, reserve0, reserve1, amount, exactIn, asset0IsInput);
108
107
109
108
if (exactIn) {
110
109
// if `exactIn`, `quote` is the amount of assets to buy from the AMM
111
- require (quote <= (asset0IsInput ? reserve1 : reserve0), InsufficientReserves ());
112
- require (quote <= IEVault (asset0IsInput ? vault1 : vault0).cash (), InsufficientCash ());
110
+ require (amount <= inLimit && quote <= outLimit, SwapLimitExceeded ());
113
111
} else {
114
112
// if `!exactIn`, `amount` is the amount of assets to buy from the AMM
115
- require (amount <= (asset0IsInput ? reserve1 : reserve0), InsufficientReserves ());
116
- require (amount <= IEVault (asset0IsInput ? vault1 : vault0).cash (), InsufficientCash ());
113
+ require (amount <= outLimit && quote <= inLimit, SwapLimitExceeded ());
117
114
}
118
115
119
116
// exactOut: increase required quote(amountIn), rounding up
@@ -161,8 +158,9 @@ contract EulerSwapPeriphery is IEulerSwapPeriphery {
161
158
162
159
while (low < high) {
163
160
uint256 mid = (low + high) / 2 ;
164
- if (dy == 0 ? eulerSwap.verify (uint256 (reserve0New), mid) : eulerSwap.verify (mid, uint256 (reserve1New)))
165
- {
161
+ (uint256 a , uint256 b ) = dy == 0 ? (uint256 (reserve0New), mid) : (mid, uint256 (reserve1New));
162
+ require (a > 0 && b > 0 , SwapLimitExceeded ());
163
+ if (eulerSwap.verify (a, b)) {
166
164
high = mid;
167
165
} else {
168
166
low = mid + 1 ;
@@ -235,19 +233,22 @@ contract EulerSwapPeriphery is IEulerSwapPeriphery {
235
233
return Math.mulDiv (uint256 (int256 (sqrt) - B), 1e18 , A, Math.Rounding.Ceil);
236
234
}
237
235
238
- /// @dev Max amount the pool can buy of tokenIn and sell of tokenOut
236
+ /// @notice Max amount the pool can buy of tokenIn and sell of tokenOut
239
237
function getLimits (address eulerSwap , address tokenIn , address tokenOut )
240
238
external
241
239
view
242
240
returns (uint256 inLimit , uint256 outLimit )
243
241
{
244
- IEulerSwap es = IEulerSwap (eulerSwap);
245
- if (! IEVC (es.EVC ()).isAccountOperatorAuthorized (es.eulerAccount (), eulerSwap)) return (0 , 0 );
242
+ return _getLimits (IEulerSwap (eulerSwap), checkTokens (IEulerSwap (eulerSwap), tokenIn, tokenOut));
243
+ }
244
+
245
+ function _getLimits (IEulerSwap es , bool asset0IsInput ) internal view returns (uint256 inLimit , uint256 outLimit ) {
246
+ if (! IEVC (es.EVC ()).isAccountOperatorAuthorized (es.eulerAccount (), address (es))) return (0 , 0 );
246
247
247
248
inLimit = outLimit = type (uint112 ).max;
248
- bool asset0IsInput = checkTokens (es, tokenIn, tokenOut);
249
249
250
250
// Supply caps on input
251
+
251
252
{
252
253
IEVault vault = IEVault (asset0IsInput ? es.vault0 () : es.vault1 ());
253
254
uint256 maxDeposit = vault.debtOf (es.eulerAccount ()) + vault.maxDeposit (es.eulerAccount ());
0 commit comments