Skip to content

Commit 9e67c0c

Browse files
committed
pass in raw values for initial and current reserves
- offsetReserve is not flexible enough for all use-cases: Instead we can do this in the hub/factory
1 parent 649b5ca commit 9e67c0c

11 files changed

+58
-56
lines changed

docs/interfaces.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -46,13 +46,13 @@ The `IEulerSwap` interface defines the core functionality for executing token sw
4646

4747
- **description**: Returns the address of the account managing EulerSwap.
4848

49-
#### `initialReserve0() external view returns (uint112);`
49+
#### `equilibriumReserve0() external view returns (uint112);`
5050

51-
- **description**: Returns the initial reserve amount of asset 0.
51+
- **description**: Returns the equilibrium reserve amount of asset 0.
5252

53-
#### `initialReserve1() external view returns (uint112);`
53+
#### `equilibriumReserve1() external view returns (uint112);`
5454

55-
- **description**: Returns the initial reserve amount of asset 1.
55+
- **description**: Returns the equilibrium reserve amount of asset 1.
5656

5757
#### `feeMultiplier() external view returns (uint256);`
5858

@@ -66,11 +66,11 @@ The `IEulerSwap` interface defines the core functionality for executing token sw
6666

6767
#### `priceX() external view returns (uint256);`
6868

69-
- **description**: Returns the price of asset X in terms of asset Y.
69+
- **description**: Returns the marginal price of asset X in terms of asset Y at the equilibrium point.
7070

7171
#### `priceY() external view returns (uint256);`
7272

73-
- **description**: Returns the price of asset Y in terms of asset X.
73+
- **description**: Returns the marginal price of asset Y in terms of asset X at the equilibrium point.
7474

7575
#### `concentrationX() external view returns (uint256);`
7676

src/EulerSwap.sol

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -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) {

src/interfaces/IEulerSwap.sol

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ interface IEulerSwap {
66
address vault0;
77
address vault1;
88
address eulerAccount;
9-
uint112 debtLimit0;
10-
uint112 debtLimit1;
9+
uint112 equilibriumReserve0;
10+
uint112 equilibriumReserve1;
11+
uint112 currReserve0;
12+
uint112 currReserve1;
1113
uint256 fee;
1214
}
1315

@@ -46,8 +48,8 @@ interface IEulerSwap {
4648
function asset0() external view returns (address);
4749
function asset1() external view returns (address);
4850
function eulerAccount() external view returns (address);
49-
function initialReserve0() external view returns (uint112);
50-
function initialReserve1() external view returns (uint112);
51+
function equilibriumReserve0() external view returns (uint112);
52+
function equilibriumReserve1() external view returns (uint112);
5153
function feeMultiplier() external view returns (uint256);
5254
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 status);
5355

test/AltDecimals.t.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ contract AltDecimals is EulerSwapTestBase {
1111
}
1212

1313
function test_alt_decimals_6_18_in() public {
14-
eulerSwap = createEulerSwap(50e6, 50e18, 0, 1e18, 1e6, 0.9e18, 0.9e18);
14+
eulerSwap = createEulerSwap(50e6, 60e18, 0, 1e18, 1e6, 0.9e18, 0.9e18);
1515
skimAll(eulerSwap, true);
1616

1717
uint256 amount = 1e6;
@@ -31,7 +31,7 @@ contract AltDecimals is EulerSwapTestBase {
3131
}
3232

3333
function test_alt_decimals_6_18_out() public {
34-
eulerSwap = createEulerSwap(50e6, 50e18, 0, 1e18, 1e6, 0.9e18, 0.9e18);
34+
eulerSwap = createEulerSwap(50e6, 60e18, 0, 1e18, 1e6, 0.9e18, 0.9e18);
3535
skimAll(eulerSwap, true);
3636

3737
uint256 amount = 1e18;
@@ -51,7 +51,7 @@ contract AltDecimals is EulerSwapTestBase {
5151
}
5252

5353
function test_alt_decimals_18_6_in() public {
54-
eulerSwap = createEulerSwap(50e18, 50e6, 0, 1e6, 1e18, 0.9e18, 0.9e18);
54+
eulerSwap = createEulerSwap(60e18, 50e6, 0, 1e6, 1e18, 0.9e18, 0.9e18);
5555
skimAll(eulerSwap, true);
5656

5757
uint256 amount = 1e18;
@@ -71,7 +71,7 @@ contract AltDecimals is EulerSwapTestBase {
7171
}
7272

7373
function test_alt_decimals_18_6_out() public {
74-
eulerSwap = createEulerSwap(50e18, 50e6, 0, 1e6, 1e18, 0.9e18, 0.9e18);
74+
eulerSwap = createEulerSwap(60e18, 50e6, 0, 1e6, 1e18, 0.9e18, 0.9e18);
7575
skimAll(eulerSwap, false);
7676

7777
uint256 amount = 1e6;

test/DepositFailures.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ contract DepositFailuresTest is EulerSwapTestBase {
1313
function setUp() public virtual override {
1414
super.setUp();
1515

16-
eulerSwap = createEulerSwap(50e18, 50e18, 0, 1e18, 1e18, 0.4e18, 0.85e18);
16+
eulerSwap = createEulerSwap(60e18, 60e18, 0, 1e18, 1e18, 0.4e18, 0.85e18);
1717
}
1818

1919
function test_griefing() public monotonicHolderNAV {

test/EulerSwapFactoryTest.t.sol

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
2020
uint256 allPoolsLengthBefore = eulerSwapFactory.allPoolsLength();
2121

2222
bytes32 salt = bytes32(uint256(1234));
23-
IEulerSwap.Params memory poolParams = IEulerSwap.Params(address(eTST), address(eTST2), holder, 1e18, 1e18, 0);
23+
IEulerSwap.Params memory poolParams =
24+
IEulerSwap.Params(address(eTST), address(eTST2), holder, 1e18, 1e18, 1e18, 1e18, 0);
2425
IEulerSwap.CurveParams memory curveParams = IEulerSwap.CurveParams(0.4e18, 0.85e18, 1e18, 1e18);
2526

2627
address predictedAddress = predictPoolAddress(address(eulerSwapFactory), poolParams, curveParams, salt);
@@ -73,7 +74,8 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
7374

7475
function testDeployWithAssetsOutOfOrderOrEqual() public {
7576
bytes32 salt = bytes32(uint256(1234));
76-
IEulerSwap.Params memory poolParams = IEulerSwap.Params(address(eTST), address(eTST), holder, 1e18, 1e18, 0);
77+
IEulerSwap.Params memory poolParams =
78+
IEulerSwap.Params(address(eTST), address(eTST), holder, 1e18, 1e18, 1e18, 1e18, 0);
7779
IEulerSwap.CurveParams memory curveParams = IEulerSwap.CurveParams(0.4e18, 0.85e18, 1e18, 1e18);
7880

7981
vm.prank(holder);
@@ -83,7 +85,8 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
8385

8486
function testDeployWithBadFee() public {
8587
bytes32 salt = bytes32(uint256(1234));
86-
IEulerSwap.Params memory poolParams = IEulerSwap.Params(address(eTST), address(eTST2), holder, 1e18, 1e18, 1e18);
88+
IEulerSwap.Params memory poolParams =
89+
IEulerSwap.Params(address(eTST), address(eTST2), holder, 1e18, 1e18, 1e18, 1e18, 1e18);
8790
IEulerSwap.CurveParams memory curveParams = IEulerSwap.CurveParams(0.4e18, 0.85e18, 1e18, 1e18);
8891

8992
vm.prank(holder);

test/EulerSwapPeriphery.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ contract EulerSwapPeripheryTest is EulerSwapTestBase {
1111
function setUp() public virtual override {
1212
super.setUp();
1313

14-
eulerSwap = createEulerSwap(50e18, 50e18, 0, 1e18, 1e18, 0.4e18, 0.85e18);
14+
eulerSwap = createEulerSwap(60e18, 60e18, 0, 1e18, 1e18, 0.4e18, 0.85e18);
1515

1616
IEulerSwap.Params memory params = getEulerSwapParams(50e18, 50e18, 0.4e18);
1717
IEulerSwap.CurveParams memory curveParams =

test/EulerSwapTest.t.sol

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ contract EulerSwapTest is EulerSwapTestBase {
99
function setUp() public virtual override {
1010
super.setUp();
1111

12-
eulerSwap = createEulerSwap(50e18, 50e18, 0, 1e18, 1e18, 0.4e18, 0.85e18);
12+
eulerSwap = createEulerSwap(60e18, 60e18, 0, 1e18, 1e18, 0.4e18, 0.85e18);
1313
}
1414

1515
function test_basicSwap_exactIn() public monotonicHolderNAV {
@@ -49,7 +49,7 @@ contract EulerSwapTest is EulerSwapTestBase {
4949

5050
int256 origNAV = getHolderNAV();
5151

52-
eulerSwap = createEulerSwap(50e18, 50e18, 0, px, py, 0.4e18, 0.85e18);
52+
eulerSwap = createEulerSwap(60e18, 60e18, 0, px, py, 0.4e18, 0.85e18);
5353

5454
uint256 amountIn = 1e18;
5555
uint256 amountOut =
@@ -102,7 +102,7 @@ contract EulerSwapTest is EulerSwapTestBase {
102102
oracle.setPrice(address(eTST), unitOfAccount, price);
103103
oracle.setPrice(address(assetTST), unitOfAccount, price);
104104

105-
eulerSwap = createEulerSwap(50e18, 50e18, 0, px, py, cx, cy);
105+
eulerSwap = createEulerSwap(60e18, 60e18, 0, px, py, cx, cy);
106106
}
107107

108108
int256 origNAV = getHolderNAV();
@@ -138,7 +138,7 @@ contract EulerSwapTest is EulerSwapTestBase {
138138
cy = bound(cy, 0.01e18, 0.99e18);
139139
fee = bound(fee, 0, 0.1e18);
140140

141-
eulerSwap = createEulerSwap(50e18, 50e18, fee, 1e18, 1e18, cx, cy);
141+
eulerSwap = createEulerSwap(60e18, 60e18, fee, 1e18, 1e18, cx, cy);
142142

143143
int256 origNAV = getHolderNAV();
144144

test/EulerSwapTestBase.t.sol

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ contract EulerSwapTestBase is EVaultTestBase {
141141
return skimmed;
142142
}
143143

144-
function getEulerSwapParams(uint112 debtLimitA, uint112 debtLimitB, uint256 fee)
144+
function getEulerSwapParams(uint112 reserve0, uint112 reserve1, uint256 fee)
145145
internal
146146
view
147147
returns (EulerSwap.Params memory)
@@ -150,8 +150,10 @@ contract EulerSwapTestBase is EVaultTestBase {
150150
vault0: address(eTST),
151151
vault1: address(eTST2),
152152
eulerAccount: holder,
153-
debtLimit0: debtLimitA,
154-
debtLimit1: debtLimitB,
153+
equilibriumReserve0: reserve0,
154+
equilibriumReserve1: reserve1,
155+
currReserve0: reserve0,
156+
currReserve1: reserve1,
155157
fee: fee
156158
});
157159
}

test/PreserveNav.t.sol

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ contract PreserveNav is EulerSwapTestBase {
3030

3131
else fee -= 0.1e18;
3232

33-
eulerSwap = createEulerSwap(50e18, 50e18, fee, 1e18, 1e18, cx, cy);
33+
eulerSwap = createEulerSwap(60e18, 60e18, fee, 1e18, 1e18, cx, cy);
3434

3535
skimAll(eulerSwap, preSkimDir);
3636
int256 nav1 = getHolderNAV();

0 commit comments

Comments
 (0)