@@ -55,6 +55,53 @@ contract DeqRouterTest is Test {
55
55
new DeqRouter (address (0 ), IERC20 (address (0 )), IStakedAvail (address (0 )));
56
56
}
57
57
58
+ function testRevertInvalidOutputToken_swapERC20ToStAvail (bytes4 rand , address tokenOut , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
59
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenOut != address (avail));
60
+ MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
61
+ address from = makeAddr ("from " );
62
+ tokenIn.mint (from, amountIn);
63
+ vm.startPrank (from);
64
+ tokenIn.approve (address (deqRouter), amountIn);
65
+ bytes memory data = abi.encodeWithSelector (
66
+ rand, tokenIn, tokenOut, amountIn, minAmountOut, new IDeqRouter.Transformation [](0 )
67
+ );
68
+ avail.mint (address (deqRouter), amountOut);
69
+ vm.expectRevert (IDeqRouter.InvalidOutputToken.selector );
70
+ deqRouter.swapERC20ToStAvail (makeAddr ("rand " ), data);
71
+ }
72
+
73
+ function testRevertSwapFailed_swapERC20ToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
74
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
75
+ MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
76
+ address from = makeAddr ("from " );
77
+ tokenIn.mint (from, amountIn);
78
+ vm.startPrank (from);
79
+ tokenIn.approve (address (deqRouter), amountIn);
80
+ bytes memory data = abi.encodeWithSelector (
81
+ rand, tokenIn, address (avail), amountIn, minAmountOut, new IDeqRouter.Transformation [](0 )
82
+ );
83
+ avail.mint (address (deqRouter), amountOut);
84
+ vm.mockCallRevert (swapRouter, data, "SomeReason " );
85
+ vm.expectRevert (abi.encodeWithSelector (IDeqRouter.SwapFailed.selector , "SomeReason " ));
86
+ deqRouter.swapERC20ToStAvail (makeAddr ("rand " ), data);
87
+ }
88
+
89
+ function testRevertInvalidSlippage_swapERC20ToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
90
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut > amountOut);
91
+ MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
92
+ address from = makeAddr ("from " );
93
+ tokenIn.mint (from, amountIn);
94
+ vm.startPrank (from);
95
+ tokenIn.approve (address (deqRouter), amountIn);
96
+ bytes memory data = abi.encodeWithSelector (
97
+ rand, tokenIn, address (avail), amountIn, minAmountOut, new IDeqRouter.Transformation [](0 )
98
+ );
99
+ avail.mint (address (deqRouter), amountOut);
100
+ vm.mockCall (swapRouter, data, abi.encode (amountOut));
101
+ vm.expectRevert (IDeqRouter.ExceedsSlippage.selector );
102
+ deqRouter.swapERC20ToStAvail (makeAddr ("rand " ), data);
103
+ }
104
+
58
105
function test_swapERC20ToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
59
106
vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
60
107
MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
@@ -72,6 +119,105 @@ contract DeqRouterTest is Test {
72
119
assertEq (avail.balanceOf (address (deqRouter)), 0 );
73
120
}
74
121
122
+ function testRevertInvalidOutputToken_swapERC20ToStAvailWithPermit (
123
+ bytes4 rand ,
124
+ address tokenOut ,
125
+ uint256 amountIn ,
126
+ uint256 amountOut ,
127
+ uint256 minAmountOut ,
128
+ uint256 deadline
129
+ ) external {
130
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenOut != address (avail));
131
+ MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
132
+ (address from , uint256 key ) = makeAddrAndKey ("from " );
133
+ tokenIn.mint (from, amountIn);
134
+ vm.startPrank (from);
135
+ sigUtils = new SigUtils (tokenIn.DOMAIN_SEPARATOR ());
136
+ SigUtils.Permit memory permit = SigUtils.Permit ({
137
+ owner: from,
138
+ spender: address (deqRouter),
139
+ value: amountIn,
140
+ nonce: tokenIn.nonces (from),
141
+ deadline: deadline
142
+ });
143
+
144
+ bytes32 digest = sigUtils.getTypedDataHash (permit);
145
+
146
+ (uint8 v , bytes32 r , bytes32 s ) = vm.sign (key, digest);
147
+ bytes memory data = abi.encodeWithSelector (
148
+ rand, tokenIn, tokenOut, amountIn, minAmountOut, new IDeqRouter.Transformation [](0 )
149
+ );
150
+ avail.mint (address (deqRouter), amountOut);
151
+ vm.expectRevert (IDeqRouter.InvalidOutputToken.selector );
152
+ deqRouter.swapERC20ToStAvailWithPermit (makeAddr ("rand " ), data, deadline, v, r, s);
153
+ }
154
+
155
+ function testRevertSwapFailed_swapERC20ToStAvailWithPermit (
156
+ bytes4 rand ,
157
+ uint256 amountIn ,
158
+ uint256 amountOut ,
159
+ uint256 minAmountOut ,
160
+ uint256 deadline
161
+ ) external {
162
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && deadline != 0 );
163
+ MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
164
+ (address from , uint256 key ) = makeAddrAndKey ("from " );
165
+ tokenIn.mint (from, amountIn);
166
+ vm.startPrank (from);
167
+ sigUtils = new SigUtils (tokenIn.DOMAIN_SEPARATOR ());
168
+ SigUtils.Permit memory permit = SigUtils.Permit ({
169
+ owner: from,
170
+ spender: address (deqRouter),
171
+ value: amountIn,
172
+ nonce: tokenIn.nonces (from),
173
+ deadline: deadline
174
+ });
175
+
176
+ bytes32 digest = sigUtils.getTypedDataHash (permit);
177
+
178
+ (uint8 v , bytes32 r , bytes32 s ) = vm.sign (key, digest);
179
+ bytes memory data = abi.encodeWithSelector (
180
+ rand, tokenIn, address (avail), amountIn, minAmountOut, new IDeqRouter.Transformation [](0 )
181
+ );
182
+ avail.mint (address (deqRouter), amountOut);
183
+ vm.mockCallRevert (swapRouter, data, "SomeReason " );
184
+ vm.expectRevert (abi.encodeWithSelector (IDeqRouter.SwapFailed.selector , "SomeReason " ));
185
+ deqRouter.swapERC20ToStAvailWithPermit (makeAddr ("rand " ), data, deadline, v, r, s);
186
+ }
187
+
188
+ function testRevertInvalidSlippage_swapERC20ToStAvailWithPermit (
189
+ bytes4 rand ,
190
+ uint256 amountIn ,
191
+ uint256 amountOut ,
192
+ uint256 minAmountOut ,
193
+ uint256 deadline
194
+ ) external {
195
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut > amountOut && deadline != 0 );
196
+ MockERC20 tokenIn = new MockERC20 ("TokenIn " , "TKNIN " );
197
+ (address from , uint256 key ) = makeAddrAndKey ("from " );
198
+ tokenIn.mint (from, amountIn);
199
+ vm.startPrank (from);
200
+ sigUtils = new SigUtils (tokenIn.DOMAIN_SEPARATOR ());
201
+ SigUtils.Permit memory permit = SigUtils.Permit ({
202
+ owner: from,
203
+ spender: address (deqRouter),
204
+ value: amountIn,
205
+ nonce: tokenIn.nonces (from),
206
+ deadline: deadline
207
+ });
208
+
209
+ bytes32 digest = sigUtils.getTypedDataHash (permit);
210
+
211
+ (uint8 v , bytes32 r , bytes32 s ) = vm.sign (key, digest);
212
+ bytes memory data = abi.encodeWithSelector (
213
+ rand, tokenIn, address (avail), amountIn, minAmountOut, new IDeqRouter.Transformation [](0 )
214
+ );
215
+ avail.mint (address (deqRouter), amountOut);
216
+ vm.mockCall (swapRouter, data, abi.encode (amountOut));
217
+ vm.expectRevert (IDeqRouter.ExceedsSlippage.selector );
218
+ deqRouter.swapERC20ToStAvailWithPermit (makeAddr ("rand " ), data, deadline, v, r, s);
219
+ }
220
+
75
221
function test_swapERC20ToStAvailWithPermit (
76
222
bytes4 rand ,
77
223
uint256 amountIn ,
@@ -106,6 +252,98 @@ contract DeqRouterTest is Test {
106
252
assertEq (avail.balanceOf (address (deqRouter)), 0 );
107
253
}
108
254
255
+ function testRevertInvalidInputToken_swapETHToStAvail (bytes4 rand , address tokenIn , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
256
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenIn != 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE );
257
+ address from = makeAddr ("from " );
258
+ vm.deal (from, amountIn);
259
+ vm.startPrank (from);
260
+ bytes memory data = abi.encodeWithSelector (
261
+ rand,
262
+ tokenIn,
263
+ address (avail),
264
+ amountIn,
265
+ minAmountOut,
266
+ new IDeqRouter.Transformation [](0 )
267
+ );
268
+ avail.mint (address (deqRouter), amountOut);
269
+ vm.expectRevert (IDeqRouter.InvalidInputToken.selector );
270
+ deqRouter.swapETHtoStAvail {value: amountIn}(data);
271
+ }
272
+
273
+ function testRevertInvalidInputAmount_swapETHToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut , uint256 wrongAmount ) external {
274
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && wrongAmount != amountIn);
275
+ address from = makeAddr ("from " );
276
+ vm.deal (from, wrongAmount);
277
+ vm.startPrank (from);
278
+ bytes memory data = abi.encodeWithSelector (
279
+ rand,
280
+ 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ,
281
+ address (avail),
282
+ amountIn,
283
+ minAmountOut,
284
+ new IDeqRouter.Transformation [](0 )
285
+ );
286
+ avail.mint (address (deqRouter), amountOut);
287
+ vm.expectRevert (IDeqRouter.InvalidInputAmount.selector );
288
+ deqRouter.swapETHtoStAvail {value: wrongAmount}(data);
289
+ }
290
+
291
+ function testRevertInvalidOutputToken_swapETHToStAvail (bytes4 rand , address tokenOut , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
292
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenOut != address (avail));
293
+ address from = makeAddr ("from " );
294
+ vm.deal (from, amountIn);
295
+ vm.startPrank (from);
296
+ bytes memory data = abi.encodeWithSelector (
297
+ rand,
298
+ 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ,
299
+ tokenOut,
300
+ amountIn,
301
+ minAmountOut,
302
+ new IDeqRouter.Transformation [](0 )
303
+ );
304
+ avail.mint (address (deqRouter), amountOut);
305
+ vm.expectRevert (IDeqRouter.InvalidOutputToken.selector );
306
+ deqRouter.swapETHtoStAvail {value: amountIn}(data);
307
+ }
308
+
309
+ function testRevertSwapFailed_swapETHToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
310
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
311
+ address from = makeAddr ("from " );
312
+ vm.deal (from, amountIn);
313
+ vm.startPrank (from);
314
+ bytes memory data = abi.encodeWithSelector (
315
+ rand,
316
+ 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ,
317
+ address (avail),
318
+ amountIn,
319
+ minAmountOut,
320
+ new IDeqRouter.Transformation [](0 )
321
+ );
322
+ avail.mint (address (deqRouter), amountOut);
323
+ vm.mockCallRevert (swapRouter, amountIn, data, "SomeReason " );
324
+ vm.expectRevert (abi.encodeWithSelector (IDeqRouter.SwapFailed.selector , "SomeReason " ));
325
+ deqRouter.swapETHtoStAvail {value: amountIn}(data);
326
+ }
327
+
328
+ function testRevertInvalidSlippage_swapETHToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
329
+ vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut > amountOut);
330
+ address from = makeAddr ("from " );
331
+ vm.deal (from, amountIn);
332
+ vm.startPrank (from);
333
+ bytes memory data = abi.encodeWithSelector (
334
+ rand,
335
+ 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE ,
336
+ address (avail),
337
+ amountIn,
338
+ minAmountOut,
339
+ new IDeqRouter.Transformation [](0 )
340
+ );
341
+ avail.mint (address (deqRouter), amountOut);
342
+ vm.mockCall (swapRouter, amountIn, data, abi.encode (amountOut));
343
+ vm.expectRevert (IDeqRouter.ExceedsSlippage.selector );
344
+ deqRouter.swapETHtoStAvail {value: amountIn}(data);
345
+ }
346
+
109
347
function test_swapETHToStAvail (bytes4 rand , uint256 amountIn , uint256 amountOut , uint256 minAmountOut ) external {
110
348
vm.assume (amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
111
349
address from = makeAddr ("from " );
0 commit comments