TokenManager::witdhraw
Withdrawal with wrapped native token does the approval but all other tokens are not approved leading to always reverting unless the user explicitly calls CapitalPool::aprove
to approve the tokenManager to spend funds in the capitalPool.
When withdrawing a particular ERC20 token, the tokenManager needs to be approved to take funds from the capital pool by calling the ERC20 approve function. Now the capital pool has an ICapitalPool::approve
function to do exactly that. The issue is that the tokenManager itself does not call this approve on the capital pool in a consistent manner. See below.
To prove the point looking at the _transfer
function
but the implementation of Rescuable::_safe_transfer_from
does not have any approval. so there is inconsistency. https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/utils/Rescuable.sol#L84
Add this line import {Rescuable} from "../src/utils/Rescuable.sol";
at top of PreMarketsTest as well as the test function below
Users can't withdraw any of their token claimable amounts unless the approve is done using CapitalPool::approve
Manual review
Be consistent with implementing approvals. You can do it just once in the TokenManager::withdraw
instead of doing it internal functions like _transfer
as shown in the vulnerability details but this option is still gas expensive since while everyone is withdrawing they have to approve the tokenManager to take money from the capitalPool.
Another better alternative would be to have a separate function in the tokenManager to this approval per token or just do it in the TokenManager::updateTokenWhiteListed
while adding tokens to the whitelist so that they are approved
This issue's severity has similar reasonings to #252, whereby If we consider the correct permissioned implementation for the `approve()` function within `CapitalPool.sol`, this would be a critical severity issue, because the withdrawal of funds will be permanently blocked and must be rescued by the admin via the `Rescuable.sol` contract, given it will always revert [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/core/CapitalPool.sol#L36-L38) when attempting to call a non-existent function selector `approve` within the TokenManager contract. Similarly, the argument here is the approval function `approve` was made permisionless, so if somebody beforehand calls approval for the TokenManager for the required token, the transfer will infact not revert when a withdrawal is invoked. I will leave open for escalation discussions, but based on my first point, I believe high severity is appropriate. It also has a slightly different root cause and fix whereby an explicit approval needs to be provided before a call to `_safe_transfer_from()`, if not, the alternative `_transfer()` function should be used to provide an approval, assuming a fix was implemented for issue #252
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.