Skip to content

Commit a37df81

Browse files
committed
test: add full test coverage
1 parent 3551cae commit a37df81

File tree

1 file changed

+238
-0
lines changed

1 file changed

+238
-0
lines changed

test/DeqRouterTest.t.sol

+238
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,53 @@ contract DeqRouterTest is Test {
5555
new DeqRouter(address(0), IERC20(address(0)), IStakedAvail(address(0)));
5656
}
5757

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+
58105
function test_swapERC20ToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
59106
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
60107
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
@@ -72,6 +119,105 @@ contract DeqRouterTest is Test {
72119
assertEq(avail.balanceOf(address(deqRouter)), 0);
73120
}
74121

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+
75221
function test_swapERC20ToStAvailWithPermit(
76222
bytes4 rand,
77223
uint256 amountIn,
@@ -106,6 +252,98 @@ contract DeqRouterTest is Test {
106252
assertEq(avail.balanceOf(address(deqRouter)), 0);
107253
}
108254

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+
109347
function test_swapETHToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
110348
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
111349
address from = makeAddr("from");

0 commit comments

Comments
 (0)