function testGetInputBasedOnOutputMiscalculatesWhichResultsInLiquidityProviderTwoGainingMoreFess() public {
* firstly we check how much liquidityprovider is able to withdraw after user swaps using swapExactInput which uses the function TswapPool::getOutputAmountBasedOnInput
* which uses the correct calculation for output
*/
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);
* Secondly we check how much liquidityproviderTwo is able to withdraw after user swaps using swapExactOutput which uses the function TswapPool::getInputAmountBasedOnOutput
* which uses the wrong calculation for Input
*/
vm.startPrank(liquidityProviderTwo);
weth.approve(address(pool), 100e18);
poolToken.approve(address(pool), 100e18);
pool.deposit(100e18, 100e18, 100e18, uint64(block.timestamp));
vm.stopPrank();
vm.startPrank(user);
uint256 expectedTwo = 9e18;
poolToken.approve(address(pool), 100e18);
pool.swapExactOutput(poolToken, weth, expectedTwo, uint64(block.timestamp));
vm.stopPrank();
vm.startPrank(liquidityProviderTwo);
pool.approve(address(pool), 100e18);
pool.withdraw(100e18, 90e18, 100e18, uint64(block.timestamp));
assertEq(pool.totalSupply(), 0);
assert(weth.balanceOf(liquidityProvider) + poolToken.balanceOf(liquidityProvider) < weth.balanceOf(liquidityProviderTwo) + poolToken.balanceOf(liquidityProviderTwo));
}
function getInputAmountBasedOnOutput(
uint256 outputAmount,
uint256 inputReserves,
uint256 outputReserves
)
public
pure
revertIfZero(outputAmount)
revertIfZero(outputReserves)
returns (uint256 inputAmount)
{
return
- ((inputReserves * outputAmount) * 10000) /
+ ((inputReserves * outputAmount) * 1000) /
((outputReserves - outputAmount) * 997);
}