The TokenManager::withdraw function fails to ensure that the TokenManager contract has approval from the CapitalPool to transfer ERC20 tokens. This prevents users from successfully withdrawing their ERC20 tokens from the contract.
In the TokenManager::withdraw function, there's an attempt to transfer ERC20 tokens from the CapitalPool to the user without obtaining the necessary approval. This results in failed withdrawals due to insufficient allowance.
The vulnerability is due to the absence of an approval step before the _safe_transfer_from call for ERC20 tokens. For a successful withdrawal, the CapitalPool must approve the TokenManager to transfer tokens on its behalf. This approval is missing in the current implementation.
Proof of Code
Add the following test to the PreMarkets.t.sol contract to demonstrate the issue:
This test demonstrates that the withdrawal fails due to the missing approval.
The vulnerability prevents users from withdrawing their ERC20 tokens from the CapitalPool through the TokenManager contract. As a result, user funds remain locked in the CapitalPool, and the withdrawal functionality for ERC20 tokens is non-operational.
Manual review
Foundry
Implement an approval mechanism for the TokenManager to spend tokens on behalf of the CapitalPool before attempting the transfer:
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. The argument up in the air is since the approval function `approve` was made permisionless, the `if` block within the internal `_transfer()` function will never be invoked if somebody beforehand calls approval for the TokenManager for the required token, so 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.
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.