Skip to content

Commit d33bc26

Browse files
Update interface
1 parent fbb52e0 commit d33bc26

File tree

3 files changed

+54
-87
lines changed

3 files changed

+54
-87
lines changed

src/EulerSwapFactory.sol

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

4-
import {IEulerSwapFactory} from "./interfaces/IEulerSwapFactory.sol";
5-
import {IEulerSwap, EulerSwap} from "./EulerSwap.sol";
4+
import {IEulerSwapFactory, IEulerSwap} from "./interfaces/IEulerSwapFactory.sol";
5+
import {EulerSwap} from "./EulerSwap.sol";
66
import {EVCUtil} from "ethereum-vault-connector/utils/EVCUtil.sol";
77

88
/// @title EulerSwapFactory contract
@@ -35,44 +35,39 @@ contract EulerSwapFactory is IEulerSwapFactory, EVCUtil {
3535

3636
constructor(address evc) EVCUtil(evc) {}
3737

38-
/// @notice Deploy EulerSwap pool.
39-
function deployPool(DeployParams memory params, bytes32 salt) external returns (address) {
40-
require(_msgSender() == params.swapAccount, Unauthorized());
41-
42-
EulerSwap pool = new EulerSwap{salt: keccak256(abi.encode(params.swapAccount, salt))}(
43-
IEulerSwap.Params({
44-
vault0: params.vault0,
45-
vault1: params.vault1,
46-
myAccount: params.swapAccount,
47-
debtLimit0: params.debtLimit0,
48-
debtLimit1: params.debtLimit1,
49-
fee: params.fee
50-
}),
51-
IEulerSwap.CurveParams({
52-
priceX: params.priceX,
53-
priceY: params.priceY,
54-
concentrationX: params.concentrationX,
55-
concentrationY: params.concentrationY
56-
})
57-
);
38+
/// @notice Deploy a new EulerSwap pool with the given parameters
39+
/// @dev The pool address is deterministically generated using CREATE2 with a salt derived from
40+
/// the swap account address and provided salt parameter. This allows the pool address to be
41+
/// predicted before deployment.
42+
/// @param params Core pool parameters including vaults, account, and fee settings
43+
/// @param curveParams Parameters defining the curve shape including prices and concentrations
44+
/// @param salt Unique value to generate deterministic pool address
45+
/// @return Address of the newly deployed pool
46+
function deployPool(IEulerSwap.Params memory params, IEulerSwap.CurveParams memory curveParams, bytes32 salt)
47+
external
48+
returns (address)
49+
{
50+
require(_msgSender() == params.myAccount, Unauthorized());
5851

59-
checkSwapAccountOperators(params.swapAccount, address(pool));
52+
EulerSwap pool = new EulerSwap{salt: keccak256(abi.encode(params.myAccount, salt))}(params, curveParams);
6053

61-
EulerSwap(pool).activate();
54+
checkSwapAccountOperators(params.myAccount, address(pool));
6255

6356
allPools.push(address(pool));
6457

58+
EulerSwap(pool).activate();
59+
6560
emit PoolDeployed(
6661
pool.asset0(),
6762
pool.asset1(),
6863
params.vault0,
6964
params.vault1,
7065
pool.feeMultiplier(),
71-
params.swapAccount,
72-
params.priceX,
73-
params.priceY,
74-
params.concentrationX,
75-
params.concentrationY,
66+
params.myAccount,
67+
curveParams.priceX,
68+
curveParams.priceY,
69+
curveParams.concentrationX,
70+
curveParams.concentrationY,
7671
address(pool)
7772
);
7873

@@ -102,6 +97,11 @@ contract EulerSwapFactory is IEulerSwapFactory, EVCUtil {
10297
return allPoolsList;
10398
}
10499

100+
/// @notice Validates operator authorization for a swap account. First checks if the account has an existing operator
101+
/// and ensures it is deauthorized. Then verifies the new pool is authorized as an operator. Finally, updates the
102+
/// mapping to track the new pool as the account's operator.
103+
/// @param swapAccount The address of the swap account.
104+
/// @param newPool The address of the new pool.
105105
function checkSwapAccountOperators(address swapAccount, address newPool) internal {
106106
address operator = swapAccountToPool[swapAccount];
107107

src/interfaces/IEulerSwapFactory.sol

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

4-
interface IEulerSwapFactory {
5-
struct DeployParams {
6-
address vault0;
7-
address vault1;
8-
address swapAccount;
9-
uint256 fee;
10-
uint256 priceX;
11-
uint256 priceY;
12-
uint256 concentrationX;
13-
uint256 concentrationY;
14-
uint112 debtLimit0;
15-
uint112 debtLimit1;
16-
}
4+
import {IEulerSwap} from "./IEulerSwap.sol";
175

18-
function deployPool(DeployParams memory params, bytes32 salt) external returns (address);
6+
interface IEulerSwapFactory {
7+
function deployPool(IEulerSwap.Params memory params, IEulerSwap.CurveParams memory curveParams, bytes32 salt)
8+
external
9+
returns (address);
1910

2011
function allPools(uint256 index) external view returns (address);
2112
function allPoolsLength() external view returns (uint256);

test/EulerSwapFactoryTest.t.sol

Lines changed: 20 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,11 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
1919
function testDeployPool() public {
2020
uint256 allPoolsLengthBefore = eulerSwapFactory.allPoolsLength();
2121

22-
IEulerSwapFactory.DeployParams memory deployParams = IEulerSwapFactory.DeployParams(
23-
address(eTST), address(eTST2), holder, 0, 1e18, 1e18, 0.4e18, 0.85e18, 50e18, 50e18
24-
);
2522
bytes32 salt = bytes32(uint256(1234));
23+
IEulerSwap.Params memory poolParams = IEulerSwap.Params(address(eTST), address(eTST2), holder, 1e18, 1e18, 0);
24+
IEulerSwap.CurveParams memory curveParams = IEulerSwap.CurveParams(0.4e18, 0.85e18, 50e18, 50e18);
2625

27-
address predictedAddress = predictPoolAddress(address(eulerSwapFactory), deployParams, salt);
26+
address predictedAddress = predictPoolAddress(address(eulerSwapFactory), poolParams, curveParams, salt);
2827

2928
IEVC.BatchItem[] memory items = new IEVC.BatchItem[](2);
3029

@@ -38,7 +37,7 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
3837
onBehalfOfAccount: holder,
3938
targetContract: address(eulerSwapFactory),
4039
value: 0,
41-
data: abi.encodeCall(EulerSwapFactory.deployPool, (deployParams, salt))
40+
data: abi.encodeCall(EulerSwapFactory.deployPool, (poolParams, curveParams, salt))
4241
});
4342

4443
vm.prank(holder);
@@ -59,12 +58,12 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
5958
onBehalfOfAccount: holder,
6059
targetContract: address(eulerSwapFactory),
6160
value: 0,
62-
data: abi.encodeCall(EulerSwapFactory.deployPool, (deployParams, bytes32(uint256(12345))))
61+
data: abi.encodeCall(EulerSwapFactory.deployPool, (poolParams, curveParams, bytes32(uint256(12345))))
6362
});
6463

6564
vm.prank(holder);
6665
vm.expectRevert(EulerSwapFactory.OldOperatorStillInstalled.selector);
67-
evc.batch(items);
66+
evc.batch(items);
6867
}
6968

7069
function testInvalidGetAllPoolsListSliceQuery() public {
@@ -74,63 +73,40 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
7473

7574
function testDeployWithAssetsOutOfOrderOrEqual() public {
7675
bytes32 salt = bytes32(uint256(1234));
76+
IEulerSwap.Params memory poolParams = IEulerSwap.Params(address(eTST), address(eTST), holder, 1e18, 1e18, 0);
77+
IEulerSwap.CurveParams memory curveParams = IEulerSwap.CurveParams(0.4e18, 0.85e18, 50e18, 50e18);
7778

7879
vm.prank(holder);
7980
vm.expectRevert(EulerSwap.AssetsOutOfOrderOrEqual.selector);
80-
eulerSwapFactory.deployPool(
81-
IEulerSwapFactory.DeployParams(
82-
address(eTST), address(eTST), holder, 0, 1e18, 1e18, 0.4e18, 0.85e18, 50e18, 50e18
83-
),
84-
salt
85-
);
81+
eulerSwapFactory.deployPool(poolParams, curveParams, salt);
8682
}
8783

8884
function testDeployWithBadFee() public {
8985
bytes32 salt = bytes32(uint256(1234));
86+
IEulerSwap.Params memory poolParams = IEulerSwap.Params(address(eTST), address(eTST2), holder, 1e18, 1e18, 1e18);
87+
IEulerSwap.CurveParams memory curveParams = IEulerSwap.CurveParams(0.4e18, 0.85e18, 50e18, 50e18);
9088

9189
vm.prank(holder);
9290
vm.expectRevert(EulerSwap.BadFee.selector);
93-
eulerSwapFactory.deployPool(
94-
IEulerSwapFactory.DeployParams(
95-
address(eTST), address(eTST2), holder, 1e18, 1e18, 1e18, 0.4e18, 0.85e18, 50e18, 50e18
96-
),
97-
salt
98-
);
91+
eulerSwapFactory.deployPool(poolParams, curveParams, salt);
9992
}
10093

101-
function predictPoolAddress(address factoryAddress, IEulerSwapFactory.DeployParams memory params, bytes32 salt)
102-
internal
103-
pure
104-
returns (address)
105-
{
94+
function predictPoolAddress(
95+
address factoryAddress,
96+
IEulerSwap.Params memory poolParams,
97+
IEulerSwap.CurveParams memory curveParams,
98+
bytes32 salt
99+
) internal pure returns (address) {
106100
return address(
107101
uint160(
108102
uint256(
109103
keccak256(
110104
abi.encodePacked(
111105
bytes1(0xff),
112106
factoryAddress,
113-
keccak256(abi.encode(address(params.swapAccount), salt)),
107+
keccak256(abi.encode(address(poolParams.myAccount), salt)),
114108
keccak256(
115-
abi.encodePacked(
116-
type(EulerSwap).creationCode,
117-
abi.encode(
118-
IEulerSwap.Params({
119-
vault0: params.vault0,
120-
vault1: params.vault1,
121-
myAccount: params.swapAccount,
122-
debtLimit0: params.debtLimit0,
123-
debtLimit1: params.debtLimit1,
124-
fee: params.fee
125-
}),
126-
IEulerSwap.CurveParams({
127-
priceX: params.priceX,
128-
priceY: params.priceY,
129-
concentrationX: params.concentrationX,
130-
concentrationY: params.concentrationY
131-
})
132-
)
133-
)
109+
abi.encodePacked(type(EulerSwap).creationCode, abi.encode(poolParams, curveParams))
134110
)
135111
)
136112
)

0 commit comments

Comments
 (0)