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 over 1 year 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.

Give us feedback!