2. Result: All fees go to owner's personal address
function test_ownerCanWithdrawFeesAnytime() public {
vm.startPrank(alice);
wbtc.approve(address(book), 2e8);
uint256 orderId1 = book.createSellOrder(
address(wbtc),
1e8,
100_000e6,
1 days
);
vm.stopPrank();
vm.startPrank(bob);
weth.approve(address(book), 2e18);
uint256 orderId2 = book.createSellOrder(
address(weth),
1e18,
5_000e6,
1 days
);
vm.stopPrank();
vm.startPrank(dan);
usdc.approve(address(book), 200_000e6);
book.buyOrder(orderId1);
vm.stopPrank();
uint256 feesAfterFirstBuy = book.totalFees();
assertGt(feesAfterFirstBuy, 0, "Should have fees after first buy");
address personalWallet1 = makeAddr("personal_wallet_1");
vm.prank(owner);
book.withdrawFees(personalWallet1);
assertEq(usdc.balanceOf(personalWallet1), feesAfterFirstBuy);
assertEq(book.totalFees(), 0, "Fees should be reset");
vm.startPrank(dan);
book.buyOrder(orderId2);
vm.stopPrank();
uint256 feesAfterSecondBuy = book.totalFees();
assertGt(feesAfterSecondBuy, 0, "Should have fees after second buy");
address personalWallet2 = makeAddr("personal_wallet_2");
vm.prank(owner);
book.withdrawFees(personalWallet2);
assertEq(usdc.balanceOf(personalWallet2), feesAfterSecondBuy);
assertEq(book.totalFees(), 0, "Fees should be reset again");
assertEq(
usdc.balanceOf(personalWallet1) + usdc.balanceOf(personalWallet2),
feesAfterFirstBuy + feesAfterSecondBuy,
"Total fees should match sum of individual withdrawals"
);
}