Skip to content

Commit 651f1e2

Browse files
factory
1 parent 577291f commit 651f1e2

8 files changed

+172
-153
lines changed

src/EulerSwap.sol

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,6 @@ 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-
2811
bytes32 public constant curve = keccak256("EulerSwap v1");
2912

3013
address public immutable vault0;

src/MaglevEulerSwapFactory.sol renamed to src/EulerSwapFactory.sol

Lines changed: 55 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,90 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity ^0.8.27;
33

4-
import {IMaglevEulerSwapFactory} from "./interfaces/IMaglevEulerSwapFactory.sol";
4+
import {IEulerSwapFactory} from "./interfaces/IEulerSwapFactory.sol";
5+
import {IEulerSwap, EulerSwap} from "./EulerSwap.sol";
56
import {Ownable} from "openzeppelin-contracts/access/Ownable.sol";
6-
import {MaglevEulerSwap as Maglev, MaglevBase} from "./MaglevEulerSwap.sol";
77

8-
/// @title MaglevEulerSwapRegistry contract
8+
/// @title EulerSwapFactory contract
99
/// @custom:security-contact [email protected]
1010
/// @author Euler Labs (https://www.eulerlabs.com/)
11-
contract MaglevEulerSwapFactory is IMaglevEulerSwapFactory, Ownable {
12-
event PoolDeployed(address indexed asset0, address indexed asset1, uint256 indexed feeMultiplier, address pool);
13-
14-
error InvalidQuery();
15-
11+
contract EulerSwapFactory is IEulerSwapFactory, Ownable {
1612
/// @dev EVC address.
1713
address public immutable evc;
1814
/// @dev An array to store all pools addresses.
1915
address[] public allPools;
20-
/// @dev Mapping from asset0/asset1/fee => pool address.
21-
mapping(bytes32 => address) public getPool;
16+
/// @dev Mapping to store pool addresses
17+
mapping(bytes32 poolKey => address pool) public getPool;
18+
19+
event PoolDeployed(
20+
address indexed asset0,
21+
address indexed asset1,
22+
uint256 indexed feeMultiplier,
23+
address swapAccount,
24+
uint256 priceX,
25+
uint256 priceY,
26+
uint256 concentrationX,
27+
uint256 concentrationY,
28+
address pool
29+
);
30+
31+
error InvalidQuery();
2232

2333
constructor(address evcAddr) Ownable(msg.sender) {
2434
evc = evcAddr;
2535
}
2636

2737
/// @notice Deploy EulerSwap pool.
28-
function deployPool(
29-
address vault0,
30-
address vault1,
31-
address holder,
32-
uint256 fee,
33-
uint256 priceX,
34-
uint256 priceY,
35-
uint256 concentrationX,
36-
uint256 concentrationY,
37-
uint112 debtLimit0,
38-
uint112 debtLimit1
39-
) external onlyOwner returns (address) {
40-
Maglev pool = new Maglev(
41-
MaglevBase.BaseParams({
38+
function deployPool(DeployParams memory params) external returns (address) {
39+
EulerSwap pool = new EulerSwap(
40+
IEulerSwap.Params({
4241
evc: address(evc),
43-
vault0: vault0,
44-
vault1: vault1,
45-
myAccount: holder,
46-
debtLimit0: debtLimit0,
47-
debtLimit1: debtLimit1,
48-
fee: fee
42+
vault0: params.vault0,
43+
vault1: params.vault1,
44+
myAccount: params.holder,
45+
debtLimit0: params.debtLimit0,
46+
debtLimit1: params.debtLimit1,
47+
fee: params.fee
4948
}),
50-
Maglev.EulerSwapParams({
51-
priceX: priceX,
52-
priceY: priceY,
53-
concentrationX: concentrationX,
54-
concentrationY: concentrationY
49+
IEulerSwap.CurveParams({
50+
priceX: params.priceX,
51+
priceY: params.priceY,
52+
concentrationX: params.concentrationX,
53+
concentrationY: params.concentrationY
5554
})
5655
);
5756

5857
address poolAsset0 = pool.asset0();
5958
address poolAsset1 = pool.asset1();
6059
uint256 feeMultiplier = pool.feeMultiplier();
61-
address myAccount = pool.myAccount();
62-
uint256 priceX = pool.priceX();
63-
uint256 priceY = pool.priceY();
64-
uint256 concentrationX = pool.concentrationX();
65-
uint256 concentrationY = pool.concentrationY();
6660

6761
bytes32 poolKey = keccak256(
68-
abi.encode(poolAsset0, poolAsset1, feeMultiplier, myAccount, priceX, priceY, concentrationX, concentrationY)
62+
abi.encode(
63+
poolAsset0,
64+
poolAsset1,
65+
feeMultiplier,
66+
params.holder,
67+
params.priceX,
68+
params.priceY,
69+
params.concentrationX,
70+
params.concentrationY
71+
)
6972
);
7073

7174
getPool[poolKey] = address(pool);
7275
allPools.push(address(pool));
7376

74-
emit PoolDeployed(poolAsset0, poolAsset1, feeMultiplier, address(pool));
77+
emit PoolDeployed(
78+
poolAsset0,
79+
poolAsset1,
80+
feeMultiplier,
81+
params.holder,
82+
params.priceX,
83+
params.priceY,
84+
params.concentrationX,
85+
params.concentrationY,
86+
address(pool)
87+
);
7588

7689
return address(pool);
7790
}

src/interfaces/IEulerSwap.sol

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,23 @@
22
pragma solidity >=0.8.0;
33

44
interface IEulerSwap {
5+
struct Params {
6+
address evc;
7+
address vault0;
8+
address vault1;
9+
address myAccount;
10+
uint112 debtLimit0;
11+
uint112 debtLimit1;
12+
uint256 fee;
13+
}
14+
15+
struct CurveParams {
16+
uint256 priceX;
17+
uint256 priceY;
18+
uint256 concentrationX;
19+
uint256 concentrationY;
20+
}
21+
522
/// @notice Optimistically sends the requested amounts of tokens to the `to`
623
/// address, invokes `uniswapV2Call` callback on `to` (if `data` was provided),
724
/// and then verifies that a sufficient amount of tokens were transferred to

src/interfaces/IMaglevEulerSwapFactory.sol renamed to src/interfaces/IEulerSwapFactory.sol

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
// SPDX-License-Identifier: UNLICENSED
22
pragma solidity >=0.8.0;
33

4-
interface IMaglevEulerSwapFactory {
5-
function deployPool(
6-
address vault0,
7-
address vault1,
8-
address holder,
9-
uint256 fee,
10-
uint256 priceX,
11-
uint256 priceY,
12-
uint256 concentrationX,
13-
uint256 concentrationY,
14-
uint112 debtLimit0,
15-
uint112 debtLimit1
16-
) external returns (address);
4+
interface IEulerSwapFactory {
5+
struct DeployParams {
6+
address vault0;
7+
address vault1;
8+
address holder;
9+
uint256 fee;
10+
uint256 priceX;
11+
uint256 priceY;
12+
uint256 concentrationX;
13+
uint256 concentrationY;
14+
uint112 debtLimit0;
15+
uint112 debtLimit1;
16+
}
17+
18+
function deployPool(DeployParams memory params) external returns (address);
1719

1820
function evc() external view returns (address);
1921
function allPools(uint256 index) external view returns (address);

test/EulerSwapFactoryTest.t.sol

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
// SPDX-License-Identifier: GPL-2.0-or-later
2+
pragma solidity ^0.8.24;
3+
4+
import {EulerSwapTestBase, EulerSwap} from "./EulerSwapTestBase.t.sol";
5+
import {EulerSwapFactory, IEulerSwapFactory} from "../src/EulerSwapFactory.sol";
6+
7+
contract EulerSwapFactoryTest is EulerSwapTestBase {
8+
EulerSwapFactory public eulerSwapFactory;
9+
10+
uint256 minFee = 0.0000000000001e18;
11+
12+
function setUp() public virtual override {
13+
super.setUp();
14+
15+
vm.prank(creator);
16+
eulerSwapFactory = new EulerSwapFactory(address(evc));
17+
}
18+
19+
function testDeployPool() public {
20+
uint256 allPoolsLengthBefore = eulerSwapFactory.allPoolsLength();
21+
22+
vm.prank(creator);
23+
EulerSwap eulerSwap = EulerSwap(
24+
eulerSwapFactory.deployPool(
25+
IEulerSwapFactory.DeployParams(
26+
address(eTST), address(eTST2), holder, 0, 1e18, 1e18, 0.4e18, 0.85e18, 50e18, 50e18
27+
)
28+
)
29+
);
30+
31+
uint256 allPoolsLengthAfter = eulerSwapFactory.allPoolsLength();
32+
bytes32 poolKey = keccak256(
33+
abi.encode(
34+
eulerSwap.asset0(),
35+
eulerSwap.asset1(),
36+
eulerSwap.feeMultiplier(),
37+
eulerSwap.myAccount(),
38+
eulerSwap.priceX(),
39+
eulerSwap.priceY(),
40+
eulerSwap.concentrationX(),
41+
eulerSwap.concentrationY()
42+
)
43+
);
44+
45+
assertEq(allPoolsLengthAfter - allPoolsLengthBefore, 1);
46+
assertEq(eulerSwapFactory.getPool(poolKey), address(eulerSwap));
47+
assertEq(eulerSwapFactory.getPool(poolKey), address(eulerSwap));
48+
49+
address[] memory poolsList = eulerSwapFactory.getAllPoolsListSlice(0, type(uint256).max);
50+
assertEq(poolsList.length, 1);
51+
assertEq(poolsList[0], address(eulerSwap));
52+
assertEq(eulerSwapFactory.allPools(0), address(eulerSwap));
53+
}
54+
55+
function testInvalidGetAllPoolsListSliceQuery() public {
56+
vm.expectRevert(EulerSwapFactory.InvalidQuery.selector);
57+
eulerSwapFactory.getAllPoolsListSlice(1, 0);
58+
}
59+
60+
function testDeployWithAssetsOutOfOrderOrEqual() public {
61+
vm.prank(creator);
62+
vm.expectRevert(EulerSwap.AssetsOutOfOrderOrEqual.selector);
63+
eulerSwapFactory.deployPool(
64+
IEulerSwapFactory.DeployParams(
65+
address(eTST), address(eTST), holder, 0, 1e18, 1e18, 0.4e18, 0.85e18, 50e18, 50e18
66+
)
67+
);
68+
}
69+
70+
function testDeployWithBadFee() public {
71+
vm.prank(creator);
72+
vm.expectRevert(EulerSwap.BadFee.selector);
73+
eulerSwapFactory.deployPool(
74+
IEulerSwapFactory.DeployParams(
75+
address(eTST), address(eTST2), holder, 1e18, 1e18, 1e18, 0.4e18, 0.85e18, 50e18, 50e18
76+
)
77+
);
78+
}
79+
}

test/EulerSwapTest.t.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: GPL-2.0-or-later
22
pragma solidity ^0.8.24;
33

4-
import {IEVault, EulerSwapTestBase, EulerSwap, TestERC20} from "./EulerSwapTestBase.t.sol";
4+
import {IEVault, IEulerSwap, EulerSwapTestBase, EulerSwap, TestERC20} from "./EulerSwapTestBase.t.sol";
55

66
contract EulerSwapTest is EulerSwapTestBase {
77
EulerSwap public eulerSwap;
@@ -16,7 +16,7 @@ contract EulerSwapTest is EulerSwapTestBase {
1616
vm.expectRevert(EulerSwap.DifferentEVC.selector);
1717

1818
new EulerSwap(
19-
EulerSwap.Params({
19+
IEulerSwap.Params({
2020
evc: address(makeAddr("RANDOM_EVC")),
2121
vault0: address(eTST),
2222
vault1: address(eTST2),
@@ -25,7 +25,7 @@ contract EulerSwapTest is EulerSwapTestBase {
2525
debtLimit1: 50e18,
2626
fee: 0
2727
}),
28-
EulerSwap.CurveParams({priceX: 1e18, priceY: 1e18, concentrationX: 4e18, concentrationY: 0.85e18})
28+
IEulerSwap.CurveParams({priceX: 1e18, priceY: 1e18, concentrationX: 4e18, concentrationY: 0.85e18})
2929
);
3030
}
3131

test/EulerSwapTestBase.t.sol

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ pragma solidity ^0.8.24;
44
import {Test, console} from "forge-std/Test.sol";
55
import {EVaultTestBase, TestERC20} from "evk-test/unit/evault/EVaultTestBase.t.sol";
66
import {IEVault} from "evk/EVault/IEVault.sol";
7-
import {EulerSwap} from "../src/EulerSwap.sol";
7+
import {IEulerSwap, EulerSwap} from "../src/EulerSwap.sol";
88
import {EulerSwapPeriphery} from "../src/EulerSwapPeriphery.sol";
99

1010
contract EulerSwapTestBase is EVaultTestBase {
@@ -87,7 +87,7 @@ contract EulerSwapTestBase is EVaultTestBase {
8787
vm.prank(creator);
8888
EulerSwap eulerSwap = new EulerSwap(
8989
getEulerSwapParams(debtLimitA, debtLimitB, fee),
90-
EulerSwap.CurveParams({priceX: px, priceY: py, concentrationX: cx, concentrationY: cy})
90+
IEulerSwap.CurveParams({priceX: px, priceY: py, concentrationX: cx, concentrationY: cy})
9191
);
9292

9393
vm.prank(holder);
@@ -146,7 +146,7 @@ contract EulerSwapTestBase is EVaultTestBase {
146146
view
147147
returns (EulerSwap.Params memory)
148148
{
149-
return EulerSwap.Params({
149+
return IEulerSwap.Params({
150150
evc: address(evc),
151151
vault0: address(eTST),
152152
vault1: address(eTST2),

0 commit comments

Comments
 (0)