Skip to content

Commit

Permalink
test: add full test coverage
Browse files Browse the repository at this point in the history
  • Loading branch information
QEDK committed Apr 30, 2024
1 parent 3551cae commit a37df81
Showing 1 changed file with 238 additions and 0 deletions.
238 changes: 238 additions & 0 deletions test/DeqRouterTest.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,53 @@ contract DeqRouterTest is Test {
new DeqRouter(address(0), IERC20(address(0)), IStakedAvail(address(0)));
}

function testRevertInvalidOutputToken_swapERC20ToStAvail(bytes4 rand, address tokenOut, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenOut != address(avail));
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
address from = makeAddr("from");
tokenIn.mint(from, amountIn);
vm.startPrank(from);
tokenIn.approve(address(deqRouter), amountIn);
bytes memory data = abi.encodeWithSelector(
rand, tokenIn, tokenOut, amountIn, minAmountOut, new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.expectRevert(IDeqRouter.InvalidOutputToken.selector);
deqRouter.swapERC20ToStAvail(makeAddr("rand"), data);
}

function testRevertSwapFailed_swapERC20ToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
address from = makeAddr("from");
tokenIn.mint(from, amountIn);
vm.startPrank(from);
tokenIn.approve(address(deqRouter), amountIn);
bytes memory data = abi.encodeWithSelector(
rand, tokenIn, address(avail), amountIn, minAmountOut, new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.mockCallRevert(swapRouter, data, "SomeReason");
vm.expectRevert(abi.encodeWithSelector(IDeqRouter.SwapFailed.selector, "SomeReason"));
deqRouter.swapERC20ToStAvail(makeAddr("rand"), data);
}

function testRevertInvalidSlippage_swapERC20ToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut > amountOut);
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
address from = makeAddr("from");
tokenIn.mint(from, amountIn);
vm.startPrank(from);
tokenIn.approve(address(deqRouter), amountIn);
bytes memory data = abi.encodeWithSelector(
rand, tokenIn, address(avail), amountIn, minAmountOut, new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.mockCall(swapRouter, data, abi.encode(amountOut));
vm.expectRevert(IDeqRouter.ExceedsSlippage.selector);
deqRouter.swapERC20ToStAvail(makeAddr("rand"), data);
}

function test_swapERC20ToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
Expand All @@ -72,6 +119,105 @@ contract DeqRouterTest is Test {
assertEq(avail.balanceOf(address(deqRouter)), 0);
}

function testRevertInvalidOutputToken_swapERC20ToStAvailWithPermit(
bytes4 rand,
address tokenOut,
uint256 amountIn,
uint256 amountOut,
uint256 minAmountOut,
uint256 deadline
) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenOut != address(avail));
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
(address from, uint256 key) = makeAddrAndKey("from");
tokenIn.mint(from, amountIn);
vm.startPrank(from);
sigUtils = new SigUtils(tokenIn.DOMAIN_SEPARATOR());
SigUtils.Permit memory permit = SigUtils.Permit({
owner: from,
spender: address(deqRouter),
value: amountIn,
nonce: tokenIn.nonces(from),
deadline: deadline
});

bytes32 digest = sigUtils.getTypedDataHash(permit);

(uint8 v, bytes32 r, bytes32 s) = vm.sign(key, digest);
bytes memory data = abi.encodeWithSelector(
rand, tokenIn, tokenOut, amountIn, minAmountOut, new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.expectRevert(IDeqRouter.InvalidOutputToken.selector);
deqRouter.swapERC20ToStAvailWithPermit(makeAddr("rand"), data, deadline, v, r, s);
}

function testRevertSwapFailed_swapERC20ToStAvailWithPermit(
bytes4 rand,
uint256 amountIn,
uint256 amountOut,
uint256 minAmountOut,
uint256 deadline
) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && deadline != 0);
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
(address from, uint256 key) = makeAddrAndKey("from");
tokenIn.mint(from, amountIn);
vm.startPrank(from);
sigUtils = new SigUtils(tokenIn.DOMAIN_SEPARATOR());
SigUtils.Permit memory permit = SigUtils.Permit({
owner: from,
spender: address(deqRouter),
value: amountIn,
nonce: tokenIn.nonces(from),
deadline: deadline
});

bytes32 digest = sigUtils.getTypedDataHash(permit);

(uint8 v, bytes32 r, bytes32 s) = vm.sign(key, digest);
bytes memory data = abi.encodeWithSelector(
rand, tokenIn, address(avail), amountIn, minAmountOut, new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.mockCallRevert(swapRouter, data, "SomeReason");
vm.expectRevert(abi.encodeWithSelector(IDeqRouter.SwapFailed.selector, "SomeReason"));
deqRouter.swapERC20ToStAvailWithPermit(makeAddr("rand"), data, deadline, v, r, s);
}

function testRevertInvalidSlippage_swapERC20ToStAvailWithPermit(
bytes4 rand,
uint256 amountIn,
uint256 amountOut,
uint256 minAmountOut,
uint256 deadline
) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut > amountOut && deadline != 0);
MockERC20 tokenIn = new MockERC20("TokenIn", "TKNIN");
(address from, uint256 key) = makeAddrAndKey("from");
tokenIn.mint(from, amountIn);
vm.startPrank(from);
sigUtils = new SigUtils(tokenIn.DOMAIN_SEPARATOR());
SigUtils.Permit memory permit = SigUtils.Permit({
owner: from,
spender: address(deqRouter),
value: amountIn,
nonce: tokenIn.nonces(from),
deadline: deadline
});

bytes32 digest = sigUtils.getTypedDataHash(permit);

(uint8 v, bytes32 r, bytes32 s) = vm.sign(key, digest);
bytes memory data = abi.encodeWithSelector(
rand, tokenIn, address(avail), amountIn, minAmountOut, new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.mockCall(swapRouter, data, abi.encode(amountOut));
vm.expectRevert(IDeqRouter.ExceedsSlippage.selector);
deqRouter.swapERC20ToStAvailWithPermit(makeAddr("rand"), data, deadline, v, r, s);
}

function test_swapERC20ToStAvailWithPermit(
bytes4 rand,
uint256 amountIn,
Expand Down Expand Up @@ -106,6 +252,98 @@ contract DeqRouterTest is Test {
assertEq(avail.balanceOf(address(deqRouter)), 0);
}

function testRevertInvalidInputToken_swapETHToStAvail(bytes4 rand, address tokenIn, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenIn != 0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE);
address from = makeAddr("from");
vm.deal(from, amountIn);
vm.startPrank(from);
bytes memory data = abi.encodeWithSelector(
rand,
tokenIn,
address(avail),
amountIn,
minAmountOut,
new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.expectRevert(IDeqRouter.InvalidInputToken.selector);
deqRouter.swapETHtoStAvail{value: amountIn}(data);
}

function testRevertInvalidInputAmount_swapETHToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut, uint256 wrongAmount) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && wrongAmount != amountIn);
address from = makeAddr("from");
vm.deal(from, wrongAmount);
vm.startPrank(from);
bytes memory data = abi.encodeWithSelector(
rand,
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
address(avail),
amountIn,
minAmountOut,
new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.expectRevert(IDeqRouter.InvalidInputAmount.selector);
deqRouter.swapETHtoStAvail{value: wrongAmount}(data);
}

function testRevertInvalidOutputToken_swapETHToStAvail(bytes4 rand, address tokenOut, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut && tokenOut != address(avail));
address from = makeAddr("from");
vm.deal(from, amountIn);
vm.startPrank(from);
bytes memory data = abi.encodeWithSelector(
rand,
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
tokenOut,
amountIn,
minAmountOut,
new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.expectRevert(IDeqRouter.InvalidOutputToken.selector);
deqRouter.swapETHtoStAvail{value: amountIn}(data);
}

function testRevertSwapFailed_swapETHToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
address from = makeAddr("from");
vm.deal(from, amountIn);
vm.startPrank(from);
bytes memory data = abi.encodeWithSelector(
rand,
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
address(avail),
amountIn,
minAmountOut,
new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.mockCallRevert(swapRouter, amountIn, data, "SomeReason");
vm.expectRevert(abi.encodeWithSelector(IDeqRouter.SwapFailed.selector, "SomeReason"));
deqRouter.swapETHtoStAvail{value: amountIn}(data);
}

function testRevertInvalidSlippage_swapETHToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut > amountOut);
address from = makeAddr("from");
vm.deal(from, amountIn);
vm.startPrank(from);
bytes memory data = abi.encodeWithSelector(
rand,
0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE,
address(avail),
amountIn,
minAmountOut,
new IDeqRouter.Transformation[](0)
);
avail.mint(address(deqRouter), amountOut);
vm.mockCall(swapRouter, amountIn, data, abi.encode(amountOut));
vm.expectRevert(IDeqRouter.ExceedsSlippage.selector);
deqRouter.swapETHtoStAvail{value: amountIn}(data);
}

function test_swapETHToStAvail(bytes4 rand, uint256 amountIn, uint256 amountOut, uint256 minAmountOut) external {
vm.assume(amountIn > 0 && amountOut > 0 && minAmountOut > 0 && minAmountOut <= amountOut);
address from = makeAddr("from");
Expand Down

0 comments on commit a37df81

Please sign in to comment.