1
1
// SPDX-License-Identifier: GPL-2.0-or-later
2
2
pragma solidity ^ 0.8.24 ;
3
3
4
- import {EulerSwapTestBase, EulerSwap} from "./EulerSwapTestBase.t.sol " ;
4
+ import {EulerSwapTestBase, IEulerSwap, IEVC, EulerSwap} from "./EulerSwapTestBase.t.sol " ;
5
5
import {EulerSwapFactory, IEulerSwapFactory} from "../src/EulerSwapFactory.sol " ;
6
6
7
7
contract EulerSwapFactoryTest is EulerSwapTestBase {
@@ -13,53 +13,58 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
13
13
super .setUp ();
14
14
15
15
vm.prank (creator);
16
- eulerSwapFactory = new EulerSwapFactory ();
16
+ eulerSwapFactory = new EulerSwapFactory (address (evc) );
17
17
}
18
18
19
19
function testDeployPool () public {
20
20
uint256 allPoolsLengthBefore = eulerSwapFactory.allPoolsLength ();
21
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
- )
22
+ IEulerSwapFactory.DeployParams memory deployParams = IEulerSwapFactory.DeployParams (
23
+ address (eTST), address (eTST2), holder, 0 , 1e18 , 1e18 , 0.4e18 , 0.85e18 , 50e18 , 50e18
29
24
);
25
+ bytes32 salt = bytes32 (uint256 (1234 ));
30
26
31
- uint256 allPoolsLengthAfter = eulerSwapFactory.allPoolsLength ();
32
- bytes32 poolKey = keccak256 (
33
- abi.encode (
34
- eulerSwap.asset0 (),
35
- eulerSwap.asset1 (),
36
- eulerSwap.vault0 (),
37
- eulerSwap.vault1 (),
38
- eulerSwap.myAccount (),
39
- eulerSwap.feeMultiplier (),
40
- eulerSwap.priceX (),
41
- eulerSwap.priceY (),
42
- eulerSwap.concentrationX (),
43
- eulerSwap.concentrationY ()
44
- )
45
- );
27
+ address predictedAddress = predictPoolAddress (address (eulerSwapFactory), deployParams, salt);
28
+
29
+ IEVC.BatchItem[] memory items = new IEVC.BatchItem [](2 );
46
30
31
+ items[0 ] = IEVC.BatchItem ({
32
+ onBehalfOfAccount: address (0 ),
33
+ targetContract: address (evc),
34
+ value: 0 ,
35
+ data: abi.encodeCall (evc.setAccountOperator, (holder, predictedAddress, true ))
36
+ });
37
+ items[1 ] = IEVC.BatchItem ({
38
+ onBehalfOfAccount: holder,
39
+ targetContract: address (eulerSwapFactory),
40
+ value: 0 ,
41
+ data: abi.encodeCall (EulerSwapFactory.deployPool, (deployParams, salt))
42
+ });
43
+
44
+ vm.prank (holder);
45
+ evc.batch (items);
46
+
47
+ EulerSwap eulerSwap = EulerSwap (eulerSwapFactory.swapAccountToPool (holder));
48
+
49
+ uint256 allPoolsLengthAfter = eulerSwapFactory.allPoolsLength ();
47
50
assertEq (allPoolsLengthAfter - allPoolsLengthBefore, 1 );
48
- assertEq (eulerSwapFactory.getPool (poolKey), address (eulerSwap));
49
- assertEq (eulerSwapFactory.getPool (poolKey), address (eulerSwap));
50
51
51
52
address [] memory poolsList = eulerSwapFactory.getAllPoolsListSlice (0 , type (uint256 ).max);
52
53
assertEq (poolsList.length , 1 );
53
54
assertEq (poolsList[0 ], address (eulerSwap));
54
55
assertEq (eulerSwapFactory.allPools (0 ), address (eulerSwap));
55
56
56
- vm.prank (creator);
57
- vm.expectRevert (EulerSwapFactory.AlreadyDeployed.selector );
58
- eulerSwapFactory.deployPool (
59
- IEulerSwapFactory.DeployParams (
60
- address (eTST), address (eTST2), holder, 0 , 1e18 , 1e18 , 0.4e18 , 0.85e18 , 50e18 , 50e18
61
- )
62
- );
57
+ items = new IEVC.BatchItem [](1 );
58
+ items[0 ] = IEVC.BatchItem ({
59
+ onBehalfOfAccount: holder,
60
+ targetContract: address (eulerSwapFactory),
61
+ value: 0 ,
62
+ data: abi.encodeCall (EulerSwapFactory.deployPool, (deployParams, bytes32 (uint256 (12345 ))))
63
+ });
64
+
65
+ vm.prank (holder);
66
+ vm.expectRevert (EulerSwapFactory.OldOperatorStillInstalled.selector );
67
+ evc.batch (items);
63
68
}
64
69
65
70
function testInvalidGetAllPoolsListSliceQuery () public {
@@ -68,21 +73,68 @@ contract EulerSwapFactoryTest is EulerSwapTestBase {
68
73
}
69
74
70
75
function testDeployWithAssetsOutOfOrderOrEqual () public {
71
- vm.prank (creator);
76
+ bytes32 salt = bytes32 (uint256 (1234 ));
77
+
78
+ vm.prank (holder);
72
79
vm.expectRevert (EulerSwap.AssetsOutOfOrderOrEqual.selector );
73
80
eulerSwapFactory.deployPool (
74
81
IEulerSwapFactory.DeployParams (
75
82
address (eTST), address (eTST), holder, 0 , 1e18 , 1e18 , 0.4e18 , 0.85e18 , 50e18 , 50e18
76
- )
83
+ ),
84
+ salt
77
85
);
78
86
}
79
87
80
88
function testDeployWithBadFee () public {
81
- vm.prank (creator);
89
+ bytes32 salt = bytes32 (uint256 (1234 ));
90
+
91
+ vm.prank (holder);
82
92
vm.expectRevert (EulerSwap.BadFee.selector );
83
93
eulerSwapFactory.deployPool (
84
94
IEulerSwapFactory.DeployParams (
85
95
address (eTST), address (eTST2), holder, 1e18 , 1e18 , 1e18 , 0.4e18 , 0.85e18 , 50e18 , 50e18
96
+ ),
97
+ salt
98
+ );
99
+ }
100
+
101
+ function predictPoolAddress (address factoryAddress , IEulerSwapFactory.DeployParams memory params , bytes32 salt )
102
+ internal
103
+ pure
104
+ returns (address )
105
+ {
106
+ return address (
107
+ uint160 (
108
+ uint256 (
109
+ keccak256 (
110
+ abi.encodePacked (
111
+ bytes1 (0xff ),
112
+ factoryAddress,
113
+ keccak256 (abi.encode (address (params.swapAccount), salt)),
114
+ 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
+ )
134
+ )
135
+ )
136
+ )
137
+ )
86
138
)
87
139
);
88
140
}
0 commit comments