Submitted by harleythedog
The CallFacet.sol contract has the function _call :
This function is utilized in a lot of different places. According to the Solidity docs, The low-level functions call, delegatecall and staticcall return true as their first return value if the account called is non-existent, as part of the design of the EVM. Account existence must be checked prior to calling if needed.
As a result, it is possible that this call will not work but _call will not notice anything went wrong. It could be possible that a user is interacting with an exchange or token that has been deleted, but _call will not notice that something has gone wrong and as a result, ether can become stuck in the contract. For this reason, it would be better to also check for the contracts existence prior to executing _target.call.
For reference, see a similar high severity reported in a Uniswap audit here (report # 9): https://github.com/Uniswap/v3-core/blob/main/audits/tob/audit.pdf
See _call here: CallFacet.sol L108.
To ensure tokens dont get stuck in edge case where user is interacting with a deleted contract, make sure to check that contract actually exists before calling it.
loki-sama (Amun) confirmed
