Skip to content

Commit 06b55c3

Browse files
chore: re-order contracts
1 parent 2bd922b commit 06b55c3

File tree

2 files changed

+131
-134
lines changed

2 files changed

+131
-134
lines changed

src/EulerSwap.sol

Lines changed: 67 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,23 @@ import {IEulerSwap} from "./interfaces/IEulerSwap.sol";
88
import {EVCUtil} from "evc/utils/EVCUtil.sol";
99

1010
contract EulerSwap is IEulerSwap, EVCUtil {
11+
struct Params {
12+
address evc;
13+
address vault0;
14+
address vault1;
15+
address myAccount;
16+
uint112 debtLimit0;
17+
uint112 debtLimit1;
18+
uint256 fee;
19+
}
20+
21+
struct CurveParams {
22+
uint256 priceX;
23+
uint256 priceY;
24+
uint256 concentrationX;
25+
uint256 concentrationY;
26+
}
27+
1128
bytes32 public constant curve = keccak256("EulerSwap v1");
1229

1330
address public immutable vault0;
@@ -30,15 +47,7 @@ contract EulerSwap is IEulerSwap, EVCUtil {
3047
uint112 public reserve1;
3148
uint32 public status; // 0 = unactivated, 1 = unlocked, 2 = locked
3249

33-
error Locked();
34-
error Overflow();
35-
error BadFee();
36-
error DifferentEVC();
37-
error AssetsOutOfOrderOrEqual();
38-
error CurveViolation();
39-
4050
event EulerSwapCreated(address indexed eulerSwap, address indexed asset0, address indexed asset1);
41-
4251
event Swap(
4352
address indexed sender,
4453
uint256 amount0In,
@@ -50,6 +59,13 @@ contract EulerSwap is IEulerSwap, EVCUtil {
5059
address indexed to
5160
);
5261

62+
error Locked();
63+
error Overflow();
64+
error BadFee();
65+
error DifferentEVC();
66+
error AssetsOutOfOrderOrEqual();
67+
error CurveViolation();
68+
5369
modifier nonReentrant() {
5470
if (status == 0) activate();
5571
require(status == 1, Locked());
@@ -58,23 +74,6 @@ contract EulerSwap is IEulerSwap, EVCUtil {
5874
status = 1;
5975
}
6076

61-
struct Params {
62-
address evc;
63-
address vault0;
64-
address vault1;
65-
address myAccount;
66-
uint112 debtLimit0;
67-
uint112 debtLimit1;
68-
uint256 fee;
69-
}
70-
71-
struct CurveParams {
72-
uint256 priceX;
73-
uint256 priceY;
74-
uint256 concentrationX;
75-
uint256 concentrationY;
76-
}
77-
7877
constructor(Params memory params, CurveParams memory curveParams) EVCUtil(params.evc) {
7978
// EulerSwap params
8079

@@ -109,34 +108,6 @@ contract EulerSwap is IEulerSwap, EVCUtil {
109108
emit EulerSwapCreated(address(this), asset0Addr, asset1Addr);
110109
}
111110

112-
/// @inheritdoc IEulerSwap
113-
function activate() public {
114-
require(status != 2, Locked());
115-
status = 1;
116-
117-
IERC20(asset0).approve(vault0, type(uint256).max);
118-
IERC20(asset1).approve(vault1, type(uint256).max);
119-
120-
IEVC(evc).enableCollateral(myAccount, vault0);
121-
IEVC(evc).enableCollateral(myAccount, vault1);
122-
}
123-
124-
/// @dev EulerSwap curve definition
125-
function f(uint256 xt, uint256 px, uint256 py, uint256 x0, uint256 y0, uint256 c) internal pure returns (uint256) {
126-
return y0 + px * 1e18 / py * (c * (2 * x0 - xt) / 1e18 + (1e18 - c) * x0 / 1e18 * x0 / xt - x0) / 1e18;
127-
}
128-
129-
/// @inheritdoc IEulerSwap
130-
function verify(uint256 newReserve0, uint256 newReserve1) public view returns (bool) {
131-
if (newReserve0 >= initialReserve0) {
132-
if (newReserve1 >= initialReserve1) return true;
133-
return newReserve0 >= f(newReserve1, priceY, priceX, initialReserve1, initialReserve0, concentrationY);
134-
} else {
135-
if (newReserve1 < initialReserve1) return false;
136-
return newReserve1 >= f(newReserve0, priceX, priceY, initialReserve0, initialReserve1, concentrationX);
137-
}
138-
}
139-
140111
/// @inheritdoc IEulerSwap
141112
function swap(uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data)
142113
external
@@ -188,29 +159,27 @@ contract EulerSwap is IEulerSwap, EVCUtil {
188159
return (reserve0, reserve1, status);
189160
}
190161

191-
// Internal utilities
162+
/// @inheritdoc IEulerSwap
163+
function activate() public {
164+
require(status != 2, Locked());
165+
status = 1;
192166

193-
function myDebt(address vault) internal view returns (uint256) {
194-
return IEVault(vault).debtOf(myAccount);
195-
}
167+
IERC20(asset0).approve(vault0, type(uint256).max);
168+
IERC20(asset1).approve(vault1, type(uint256).max);
196169

197-
function myBalance(address vault) internal view returns (uint256) {
198-
uint256 shares = IEVault(vault).balanceOf(myAccount);
199-
return shares == 0 ? 0 : IEVault(vault).convertToAssets(shares);
170+
IEVC(evc).enableCollateral(myAccount, vault0);
171+
IEVC(evc).enableCollateral(myAccount, vault1);
200172
}
201173

202-
function offsetReserve(uint112 reserve, address vault) internal view returns (uint112) {
203-
uint256 offset;
204-
uint256 debt = myDebt(vault);
205-
206-
if (debt != 0) {
207-
offset = reserve > debt ? reserve - debt : 0;
174+
/// @inheritdoc IEulerSwap
175+
function verify(uint256 newReserve0, uint256 newReserve1) public view returns (bool) {
176+
if (newReserve0 >= initialReserve0) {
177+
if (newReserve1 >= initialReserve1) return true;
178+
return newReserve0 >= f(newReserve1, priceY, priceX, initialReserve1, initialReserve0, concentrationY);
208179
} else {
209-
offset = reserve + myBalance(vault);
180+
if (newReserve1 < initialReserve1) return false;
181+
return newReserve1 >= f(newReserve0, priceX, priceY, initialReserve0, initialReserve1, concentrationX);
210182
}
211-
212-
require(offset <= type(uint112).max, Overflow());
213-
return uint112(offset);
214183
}
215184

216185
function withdrawAssets(address vault, uint256 amount, address to) internal {
@@ -243,4 +212,32 @@ contract EulerSwap is IEulerSwap, EVCUtil {
243212
}
244213
}
245214
}
215+
216+
function myDebt(address vault) internal view returns (uint256) {
217+
return IEVault(vault).debtOf(myAccount);
218+
}
219+
220+
function myBalance(address vault) internal view returns (uint256) {
221+
uint256 shares = IEVault(vault).balanceOf(myAccount);
222+
return shares == 0 ? 0 : IEVault(vault).convertToAssets(shares);
223+
}
224+
225+
function offsetReserve(uint112 reserve, address vault) internal view returns (uint112) {
226+
uint256 offset;
227+
uint256 debt = myDebt(vault);
228+
229+
if (debt != 0) {
230+
offset = reserve > debt ? reserve - debt : 0;
231+
} else {
232+
offset = reserve + myBalance(vault);
233+
}
234+
235+
require(offset <= type(uint112).max, Overflow());
236+
return uint112(offset);
237+
}
238+
239+
/// @dev EulerSwap curve definition
240+
function f(uint256 xt, uint256 px, uint256 py, uint256 x0, uint256 y0, uint256 c) internal pure returns (uint256) {
241+
return y0 + px * 1e18 / py * (c * (2 * x0 - xt) / 1e18 + (1e18 - c) * x0 / 1e18 * x0 / xt - x0) / 1e18;
242+
}
246243
}

test/EulerSwapTestBase.t.sol

Lines changed: 64 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@ contract EulerSwapTestBase is EVaultTestBase {
1616

1717
EulerSwapPeriphery public periphery;
1818

19+
modifier monotonicHolderNAV() {
20+
int256 orig = getHolderNAV();
21+
_;
22+
assertGe(getHolderNAV(), orig);
23+
}
24+
1925
function setUp() public virtual override {
2026
super.setUp();
2127

@@ -38,11 +44,35 @@ contract EulerSwapTestBase is EVaultTestBase {
3844

3945
// Funding
4046

41-
_mintAndDeposit(depositor, eTST, 100e18);
42-
_mintAndDeposit(depositor, eTST2, 100e18);
47+
mintAndDeposit(depositor, eTST, 100e18);
48+
mintAndDeposit(depositor, eTST2, 100e18);
49+
50+
mintAndDeposit(holder, eTST, 10e18);
51+
mintAndDeposit(holder, eTST2, 10e18);
52+
}
4353

44-
_mintAndDeposit(holder, eTST, 10e18);
45-
_mintAndDeposit(holder, eTST2, 10e18);
54+
function skimAll(EulerSwap ml, bool order) public {
55+
if (order) {
56+
runSkimAll(ml, true);
57+
runSkimAll(ml, false);
58+
} else {
59+
runSkimAll(ml, false);
60+
runSkimAll(ml, true);
61+
}
62+
}
63+
64+
function getHolderNAV() internal view returns (int256) {
65+
uint256 balance0 = eTST.convertToAssets(eTST.balanceOf(holder));
66+
uint256 debt0 = eTST.debtOf(holder);
67+
uint256 balance1 = eTST2.convertToAssets(eTST2.balanceOf(holder));
68+
uint256 debt1 = eTST2.debtOf(holder);
69+
70+
uint256 balValue = oracle.getQuote(balance0, address(assetTST), unitOfAccount)
71+
+ oracle.getQuote(balance1, address(assetTST2), unitOfAccount);
72+
uint256 debtValue = oracle.getQuote(debt0, address(assetTST), unitOfAccount)
73+
+ oracle.getQuote(debt1, address(assetTST2), unitOfAccount);
74+
75+
return int256(balValue) - int256(debtValue);
4676
}
4777

4878
function createEulerSwap(
@@ -66,23 +96,7 @@ contract EulerSwapTestBase is EVaultTestBase {
6696
return eulerSwap;
6797
}
6898

69-
function getEulerSwapParams(uint112 debtLimitA, uint112 debtLimitB, uint256 fee)
70-
internal
71-
view
72-
returns (EulerSwap.Params memory)
73-
{
74-
return EulerSwap.Params({
75-
evc: address(evc),
76-
vault0: address(eTST),
77-
vault1: address(eTST2),
78-
myAccount: holder,
79-
debtLimit0: debtLimitA,
80-
debtLimit1: debtLimitB,
81-
fee: fee
82-
});
83-
}
84-
85-
function _mintAndDeposit(address who, IEVault vault, uint256 amount) internal {
99+
function mintAndDeposit(address who, IEVault vault, uint256 amount) internal {
86100
TestERC20 tok = TestERC20(vault.asset());
87101
tok.mint(who, amount);
88102

@@ -93,41 +107,7 @@ contract EulerSwapTestBase is EVaultTestBase {
93107
vault.deposit(amount, who);
94108
}
95109

96-
function getHolderNAV() public view returns (int256) {
97-
uint256 balance0 = eTST.convertToAssets(eTST.balanceOf(holder));
98-
uint256 debt0 = eTST.debtOf(holder);
99-
uint256 balance1 = eTST2.convertToAssets(eTST2.balanceOf(holder));
100-
uint256 debt1 = eTST2.debtOf(holder);
101-
102-
uint256 balValue = oracle.getQuote(balance0, address(assetTST), unitOfAccount)
103-
+ oracle.getQuote(balance1, address(assetTST2), unitOfAccount);
104-
uint256 debtValue = oracle.getQuote(debt0, address(assetTST), unitOfAccount)
105-
+ oracle.getQuote(debt1, address(assetTST2), unitOfAccount);
106-
107-
return int256(balValue) - int256(debtValue);
108-
}
109-
110-
modifier monotonicHolderNAV() {
111-
int256 orig = getHolderNAV();
112-
_;
113-
assertGe(getHolderNAV(), orig);
114-
}
115-
116-
function logState(address ml) internal view {
117-
(uint112 reserve0, uint112 reserve1,) = EulerSwap(ml).getReserves();
118-
119-
console.log("--------------------");
120-
console.log("Account States:");
121-
console.log("HOLDER");
122-
console.log(" eTST Vault assets: ", eTST.convertToAssets(eTST.balanceOf(holder)));
123-
console.log(" eTST Vault debt: ", eTST.debtOf(holder));
124-
console.log(" eTST2 Vault assets: ", eTST2.convertToAssets(eTST2.balanceOf(holder)));
125-
console.log(" eTST2 Vault debt: ", eTST2.debtOf(holder));
126-
console.log(" reserve0: ", reserve0);
127-
console.log(" reserve1: ", reserve1);
128-
}
129-
130-
function _skimAll(EulerSwap ml, bool dir) internal returns (uint256) {
110+
function runSkimAll(EulerSwap ml, bool dir) internal returns (uint256) {
131111
uint256 skimmed = 0;
132112
uint256 val = 1;
133113

@@ -161,13 +141,33 @@ contract EulerSwapTestBase is EVaultTestBase {
161141
return skimmed;
162142
}
163143

164-
function skimAll(EulerSwap ml, bool order) public {
165-
if (order) {
166-
_skimAll(ml, true);
167-
_skimAll(ml, false);
168-
} else {
169-
_skimAll(ml, false);
170-
_skimAll(ml, true);
171-
}
144+
function getEulerSwapParams(uint112 debtLimitA, uint112 debtLimitB, uint256 fee)
145+
internal
146+
view
147+
returns (EulerSwap.Params memory)
148+
{
149+
return EulerSwap.Params({
150+
evc: address(evc),
151+
vault0: address(eTST),
152+
vault1: address(eTST2),
153+
myAccount: holder,
154+
debtLimit0: debtLimitA,
155+
debtLimit1: debtLimitB,
156+
fee: fee
157+
});
158+
}
159+
160+
function logState(address ml) internal view {
161+
(uint112 reserve0, uint112 reserve1,) = EulerSwap(ml).getReserves();
162+
163+
console.log("--------------------");
164+
console.log("Account States:");
165+
console.log("HOLDER");
166+
console.log(" eTST Vault assets: ", eTST.convertToAssets(eTST.balanceOf(holder)));
167+
console.log(" eTST Vault debt: ", eTST.debtOf(holder));
168+
console.log(" eTST2 Vault assets: ", eTST2.convertToAssets(eTST2.balanceOf(holder)));
169+
console.log(" eTST2 Vault debt: ", eTST2.debtOf(holder));
170+
console.log(" reserve0: ", reserve0);
171+
console.log(" reserve1: ", reserve1);
172172
}
173173
}

0 commit comments

Comments
 (0)