Skip to content

Commit f0ae737

Browse files
committed
Add full test coverage
1 parent f42adbb commit f0ae737

3 files changed

Lines changed: 113 additions & 4 deletions

File tree

.github/workflows/test.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ jobs:
3434
forge build --sizes
3535
id: build
3636

37-
# - name: Run Forge tests
38-
# run: |
39-
# forge test -vvv
40-
# id: test
37+
- name: Run Forge tests
38+
run: |
39+
forge test -vvv
40+
id: test

test/.gitkeep

Whitespace-only changes.
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
// SPDX-License-Identifier: MIT
2+
pragma solidity ^0.8.28;
3+
4+
import {ERC20Mock} from "@openzeppelin/contracts/mocks/token/ERC20Mock.sol";
5+
import {IERC20} from "forge-std/interfaces/IERC20.sol";
6+
import {Test} from "forge-std/Test.sol";
7+
8+
import {ForwardingAddress} from "../src/ForwardingAddress.sol";
9+
import {ForwardingAddressFactory} from "../src/ForwardingAddressFactory.sol";
10+
11+
contract ForwardingAddressFactoryTest is Test {
12+
ForwardingAddressFactory public factory;
13+
ERC20Mock public erc20Mock;
14+
15+
function setUp() public {
16+
factory = new ForwardingAddressFactory();
17+
erc20Mock = new ERC20Mock();
18+
}
19+
20+
function testFuzz_createForwardingAddress(bytes32 salt) public {
21+
(address receiver,) = makeAddrAndKey("receiver");
22+
23+
address expectedAddr = factory.getAddress(receiver, salt);
24+
address actualAddress = address(factory.createForwardingAddress(payable(receiver), salt));
25+
26+
assertEq(expectedAddr, actualAddress);
27+
}
28+
29+
function testFuzz_createForwardingAddressAlreadyDeployed(bytes32 salt) public {
30+
(address receiver,) = makeAddrAndKey("receiver");
31+
32+
address expectedAddr = factory.getAddress(receiver, salt);
33+
factory.createForwardingAddress(payable(receiver), salt);
34+
address actualAddress = address(factory.createForwardingAddress(payable(receiver), salt));
35+
36+
assertEq(expectedAddr, actualAddress);
37+
}
38+
39+
function testFuzz_sweepForETH(bytes32 salt, uint256 amount) public {
40+
(address receiver,) = makeAddrAndKey("receiver");
41+
42+
address forwarder = factory.getAddress(receiver, salt);
43+
uint256 initBalance = receiver.balance;
44+
vm.deal(forwarder, amount);
45+
assertEq(receiver.balance, initBalance);
46+
assertEq(forwarder.balance, amount);
47+
48+
address[] memory tokens = new address[](1);
49+
tokens[0] = address(0);
50+
factory.sweepFor(payable(receiver), salt, tokens);
51+
assertEq(receiver.balance, initBalance + amount);
52+
assertEq(forwarder.balance, 0);
53+
}
54+
55+
function testFuzz_sweepForFailedETHWithdraw(bytes32 salt, uint256 amount) public {
56+
// create2Deployer address, a known non payable contract
57+
address receiver = 0x4e59b44847b379578588920cA78FbF26c0B4956C;
58+
59+
address forwarder = factory.getAddress(receiver, salt);
60+
uint256 initBalance = receiver.balance;
61+
vm.deal(forwarder, amount);
62+
assertEq(receiver.balance, initBalance);
63+
assertEq(forwarder.balance, amount);
64+
65+
address[] memory tokens = new address[](1);
66+
tokens[0] = address(0);
67+
vm.expectRevert(abi.encodeWithSelector(ForwardingAddress.FailedETHWithdraw.selector, receiver, tokens[0]));
68+
factory.sweepFor(payable(receiver), salt, tokens);
69+
assertEq(receiver.balance, initBalance);
70+
assertEq(forwarder.balance, amount);
71+
}
72+
73+
function testFuzz_sweepForERC20(bytes32 salt, uint256 amount) public {
74+
(address receiver,) = makeAddrAndKey("receiver");
75+
76+
address forwarder = factory.getAddress(receiver, salt);
77+
erc20Mock.mint(forwarder, amount);
78+
assertEq(IERC20(address(erc20Mock)).balanceOf(receiver), 0);
79+
assertEq(IERC20(address(erc20Mock)).balanceOf(forwarder), amount);
80+
81+
address[] memory tokens = new address[](1);
82+
tokens[0] = address(erc20Mock);
83+
factory.sweepFor(payable(receiver), salt, tokens);
84+
assertEq(IERC20(address(erc20Mock)).balanceOf(receiver), amount);
85+
assertEq(IERC20(address(erc20Mock)).balanceOf(forwarder), 0);
86+
}
87+
88+
function testFuzz_sweepForMulti(bytes32 salt, uint256 amount) public {
89+
(address receiver,) = makeAddrAndKey("receiver");
90+
91+
address forwarder = factory.getAddress(receiver, salt);
92+
uint256 initBalance = receiver.balance;
93+
vm.deal(forwarder, amount);
94+
erc20Mock.mint(forwarder, amount);
95+
assertEq(receiver.balance, initBalance);
96+
assertEq(forwarder.balance, amount);
97+
assertEq(IERC20(address(erc20Mock)).balanceOf(receiver), 0);
98+
assertEq(IERC20(address(erc20Mock)).balanceOf(forwarder), amount);
99+
100+
address[] memory tokens = new address[](2);
101+
tokens[0] = address(0);
102+
tokens[1] = address(erc20Mock);
103+
factory.sweepFor(payable(receiver), salt, tokens);
104+
assertEq(receiver.balance, initBalance + amount);
105+
assertEq(forwarder.balance, 0);
106+
assertEq(IERC20(address(erc20Mock)).balanceOf(receiver), amount);
107+
assertEq(IERC20(address(erc20Mock)).balanceOf(forwarder), 0);
108+
}
109+
}

0 commit comments

Comments
 (0)