function testFlawedSwapExactOutput() public {
vm.startPrank(liquidityProvider);
weth.approve(address(pool), 100e18);
poolToken.approve(address(pool), 100e18);
pool.deposit(100e18, 100e18, 100e18, uint64(block.timestamp));
vm.stopPrank();
vm.startPrank(user);
uint256 expected = 9e18;
poolToken.approve(address(pool), 10e18);
pool.swapExactInput(poolToken, 10e18, weth, expected, uint64(block.timestamp));
vm.stopPrank();
vm.startPrank(liquidityProvider);
pool.approve(address(pool), 100e18);
pool.withdraw(100e18, 90e18, 100e18, uint64(block.timestamp));
assertEq(pool.totalSupply(), 0);
assert(weth.balanceOf(liquidityProvider) + poolToken.balanceOf(liquidityProvider) > 400e18);
}
function testFlawedSwapExactOutput() public {
uint256 initialLiquidity = 100e18;
vm.startPrank(liquidityProvider);
console.log("liquidityProvider weth balance before deposit:", weth.balanceOf(address(liquidityProvider)));
console.log(
"liquidityProvider poolToken balance after deposit:", poolToken.balanceOf(address(liquidityProvider))
);
weth.approve(address(pool), initialLiquidity);
poolToken.approve(address(pool), initialLiquidity);
pool.deposit({
wethToDeposit: initialLiquidity,
minimumLiquidityTokensToMint: 0,
maximumPoolTokensToDeposit: initialLiquidity,
deadline: uint64(block.timestamp)
});
console.log("liquidityProvider weth balance after deposit:", weth.balanceOf(address(liquidityProvider)));
console.log("liquidityProvider poolToken balance after deposit:", weth.balanceOf(address(liquidityProvider)));
vm.stopPrank();
address someUser = makeAddr("someUser");
uint256 userInitialPoolTokenBalance = 11e18;
poolToken.mint(someUser, userInitialPoolTokenBalance);
console.log("someUser poolToken balance before withdrew:", poolToken.balanceOf(address(someUser)));
vm.startPrank(someUser);
poolToken.approve(address(pool), type(uint256).max);
pool.swapExactOutput(poolToken, weth, 1 ether, uint64(block.timestamp));
assertLt(poolToken.balanceOf(someUser), 1 ether);
vm.stopPrank();
vm.startPrank(liquidityProvider);
pool.withdraw(
pool.balanceOf(liquidityProvider),
1,
1,
uint64(block.timestamp)
);
console.log("liquidityProvider weth balance after withdrew:", weth.balanceOf(address(liquidityProvider)));
console.log(
"liquidityProvider poolToken balance after withdrew:", poolToken.balanceOf(address(liquidityProvider))
);
assertEq(weth.balanceOf(address(pool)), 0);
assertEq(poolToken.balanceOf(address(pool)), 0);
console.log("someUser poolToken balance after withdrew:", poolToken.balanceOf(address(someUser)));
}