Summary
The function TSwapPool::deposit
must have verification if the variable maximumPoolTokensToDeposit
is different to zero and equal or greather than minimumLiquidityTokensToMint
Vulnerability Details
When TSwapPool::deposit
is called we don't have a verification if the maximumPoolTokensToDeposit
variable is zero and equal or greather than minimumLiquidityTokensToMint
to have a valid parameter, as we can see below:
function deposit(
uint256 wethToDeposit,
uint256 minimumLiquidityTokensToMint,
uint256 maximumPoolTokensToDeposit,
uint64 deadline
)
external
revertIfZero(wethToDeposit)
returns (uint256 liquidityTokensToMint)
{
...
Impact
If the maximumPoolTokensToDeposit
is zero or less than the minimumLiquidityTokensToMint
the deposit will be invalid.
Tools Used
Solidity and Foundry
Proof of Concept
Add the following PoC to test/unit/TSwapPool.t.sol
:
function testIfMaximumPoolTokensToDepositIsZeroOrLessThanMinimumLiquidityTokensToMint() public {
vm.startPrank(liquidityProvider);
uint256 wethToDeposit = 200e18;
uint256 minimumLiquidityTokensToMint = 1;
uint256 maximumPoolTokensToDeposit = 0;
uint64 deadline = uint64(block.timestamp);
weth.approve(address(pool), wethToDeposit);
poolToken.approve(address(pool), wethToDeposit);
vm.expectRevert(TSwapPool.TSwapPool__MustBeMoreThanZero.selector);
pool.deposit(
wethToDeposit, minimumLiquidityTokensToMint, maximumPoolTokensToDeposit, deadline
);
minimumLiquidityTokensToMint = 10;
maximumPoolTokensToDeposit = 9;
vm.expectRevert(TSwapPool.TSwapPool__MaximumPoolTokensToDepositMustBeEqualOrMoreThanMinimumLiquidityTokensToMint.selector);
pool.deposit(
wethToDeposit, minimumLiquidityTokensToMint, maximumPoolTokensToDeposit, deadline
);
vm.stopPrank();
}
Recommendations
You need to add the custom error in the src/TSwapPool.sol
:
error TSwapPool__MustBeMoreThanZero();
+ error TSwapPool__MaximumPoolTokensToDepositMustBeEqualOrMoreThanMinimumLiquidityTokensToMint();
And add the verification on TSwapPool::deposit
:
function deposit(
uint256 wethToDeposit,
uint256 minimumLiquidityTokensToMint,
uint256 maximumPoolTokensToDeposit,
uint64 deadline
)
external
revertIfZero(wethToDeposit)
+ revertIfZero(maximumPoolTokensToDeposit)
returns (uint256 liquidityTokensToMint)
{
+ if(minimumLiquidityTokensToMint > maximumPoolTokensToDeposit) {
+ revert TSwapPool__MaximumPoolTokensToDepositMustBeEqualOrMoreThanMinimumLiquidityTokensToMint();
+ }
if (wethToDeposit < MINIMUM_WETH_LIQUIDITY) {
revert TSwapPool__WethDepositAmountTooLow(
MINIMUM_WETH_LIQUIDITY,
wethToDeposit
);
}