@@ -21,10 +21,8 @@ contract EulerSwap is IEulerSwap, EVCUtil {
2121 address public immutable asset0;
2222 address public immutable asset1;
2323 address public immutable eulerAccount;
24- uint112 public immutable debtLimit0;
25- uint112 public immutable debtLimit1;
26- uint112 public immutable initialReserve0;
27- uint112 public immutable initialReserve1;
24+ uint112 public immutable equilibriumReserve0;
25+ uint112 public immutable equilibriumReserve1;
2826 uint256 public immutable feeMultiplier;
2927
3028 uint256 public immutable priceX;
@@ -68,7 +66,11 @@ contract EulerSwap is IEulerSwap, EVCUtil {
6866 // EulerSwap params
6967
7068 require (params.fee < 1e18 , BadParam ());
71- require (params.debtLimit0 <= type (uint112 ).max && params.debtLimit1 <= type (uint112 ).max, BadParam ());
69+ require (
70+ params.equilibriumReserve0 <= type (uint112 ).max && params.equilibriumReserve1 <= type (uint112 ).max,
71+ BadParam ()
72+ );
73+ require (params.currReserve0 <= type (uint112 ).max && params.currReserve1 <= type (uint112 ).max, BadParam ());
7274 require (curveParams.priceX > 0 && curveParams.priceY > 0 , BadParam ());
7375 require (curveParams.priceX <= 1e36 && curveParams.priceY <= 1e36 , BadParam ());
7476 require (curveParams.concentrationX <= 1e18 && curveParams.concentrationY <= 1e18 , BadParam ());
@@ -83,10 +85,10 @@ contract EulerSwap is IEulerSwap, EVCUtil {
8385 asset0 = asset0Addr;
8486 asset1 = asset1Addr;
8587 eulerAccount = params.eulerAccount;
86- debtLimit0 = params.debtLimit0 ;
87- debtLimit1 = params.debtLimit1 ;
88- initialReserve0 = reserve0 = offsetReserve ( params.debtLimit0, params.vault0) ;
89- initialReserve1 = reserve1 = offsetReserve ( params.debtLimit1, params.vault1) ;
88+ equilibriumReserve0 = params.equilibriumReserve0 ;
89+ equilibriumReserve1 = params.equilibriumReserve1 ;
90+ reserve0 = params.currReserve0 ;
91+ reserve1 = params.currReserve1 ;
9092 feeMultiplier = 1e18 - params.fee;
9193
9294 // Curve params
@@ -96,6 +98,11 @@ contract EulerSwap is IEulerSwap, EVCUtil {
9698 concentrationX = curveParams.concentrationX;
9799 concentrationY = curveParams.concentrationY;
98100
101+ // Validate reserves
102+
103+ require (verify (reserve0, reserve1), CurveViolation ());
104+ require (! verify (reserve0 > 0 ? reserve0 - 1 : 0 , reserve1 > 0 ? reserve1 - 1 : 0 ), CurveViolation ());
105+
99106 emit EulerSwapCreated (asset0Addr, asset1Addr);
100107 }
101108
@@ -184,12 +191,14 @@ contract EulerSwap is IEulerSwap, EVCUtil {
184191
185192 /// @inheritdoc IEulerSwap
186193 function verify (uint256 newReserve0 , uint256 newReserve1 ) public view returns (bool ) {
187- if (newReserve0 >= initialReserve0) {
188- if (newReserve1 >= initialReserve1) return true ;
189- return newReserve0 >= f (newReserve1, priceY, priceX, initialReserve1, initialReserve0, concentrationY);
194+ if (newReserve0 >= equilibriumReserve0) {
195+ if (newReserve1 >= equilibriumReserve1) return true ;
196+ return
197+ newReserve0 >= f (newReserve1, priceY, priceX, equilibriumReserve1, equilibriumReserve0, concentrationY);
190198 } else {
191- if (newReserve1 < initialReserve1) return false ;
192- return newReserve1 >= f (newReserve0, priceX, priceY, initialReserve0, initialReserve1, concentrationX);
199+ if (newReserve1 < equilibriumReserve1) return false ;
200+ return
201+ newReserve1 >= f (newReserve0, priceX, priceY, equilibriumReserve0, equilibriumReserve1, concentrationX);
193202 }
194203 }
195204
@@ -237,20 +246,6 @@ contract EulerSwap is IEulerSwap, EVCUtil {
237246 return shares == 0 ? 0 : IEVault (vault).convertToAssets (shares);
238247 }
239248
240- function offsetReserve (uint112 reserve , address vault ) internal view returns (uint112 ) {
241- uint256 offset;
242- uint256 debt = myDebt (vault);
243-
244- if (debt != 0 ) {
245- offset = reserve > debt ? reserve - debt : 0 ;
246- } else {
247- offset = reserve + myBalance (vault);
248- }
249-
250- require (offset <= type (uint112 ).max, Overflow ());
251- return uint112 (offset);
252- }
253-
254249 /// @dev EulerSwap curve definition
255250 /// Pre-conditions: x <= x0, 1 <= {px,py} <= 1e36, {x0,y0} <= type(uint112).max, c <= 1e18
256251 function f (uint256 x , uint256 px , uint256 py , uint256 x0 , uint256 y0 , uint256 c ) internal pure returns (uint256 ) {
0 commit comments