First Flight #18: T-Swap

First Flight #18
Beginner FriendlyDeFiFoundry
100 EXP
View results
Submission Details
Severity: high
Valid

The `TSwapPool.getInputAmountBasedOnOutput` function inaccurately calculates fees from user swaps, leading to losses

Summary

  • The TSwap protocol is intended to charge a 0.3% fee on swaps by applying a 997/1000 multiplier. However, it is erroneously applying a 997/10_000 multiplier, meaning that the user is paying 10 times what they should be paying. This discrepancy means the protocol is collecting substantially higher fees than designed.

Vulnerability Details

  • PoC - Copy this test into TSwapPool.t.sol.

function testShouldReturnTheCorrectInputAmountBasedOnOutputAmount() public {
uint256 outputAmount = 10e18;
uint256 inputReserves = 100e18;
uint256 outputReserves = 100e18;
//According to documentation: 'Each applies a 997 out of 1000 multiplier.'
uint256 expectedInputAmount = ((inputReserves * outputAmount) * 1000) / ((outputReserves - outputAmount) * 997);
uint256 actualInputAmount = pool.getInputAmountBasedOnOutput(outputAmount, inputReserves, outputReserves);
//actualInputAmount is 10 times higher than expectedInputAmount
assertEq(expectedInputAmount, actualInputAmount);
}

Impact

  • The protocol takes more fees than expected from users, resulting in a significant loss.

Tools Used

  • Manual review

Recommendations

  • Change from 10000 to 1_000.

function getInputAmountBasedOnOutput(
uint256 outputAmount,
uint256 inputReserves,
uint256 outputReserves
)
public
pure
revertIfZero(outputAmount)
revertIfZero(outputReserves)
returns (uint256 inputAmount)
{
- return ((inputReserves * outputAmount) * 10000) / ((outputReserves - outputAmount) * 997);
+ return ((inputReserves * outputAmount) * 1_000) / ((outputReserves - outputAmount) * 997);
}
Updates

Appeal created

inallhonesty Lead Judge 12 months ago
Submission Judgement Published
Validated
Assigned finding tags:

Incorrect fee calculation in TSwapPool::getInputAmountBasedOnOutput causes protocol to take too many tokens from users, resulting in lost fees

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.