The protocol's token transfer implementation is not compatible with fee-on-transfer and rebasing tokens, leading to failed token transfers for such ERC20
tokens.
The protocol's _transfer function in TokenManager.sol
performs balance checks before and after the token transfer to ensure the transfer was successful. However, these checks do not account for the behavior of fee-on-transfer and rebasing tokens, which can cause the balances to change in ways that trigger the function's revert conditions.
This is how _transfer
function is implemented in TokenManager.sol
:
Fee-on-transfer tokens deduct a fee from the amount being transferred, which means the recipient's balance will increase by less than the sent amount. This will cause the balance check toBalanceAft != toBalanceBef + _amount
to fail and the transfer to be reverted`.
Similarly, rebasing tokens can increase the balance of the token holder, which will also cause the balance checks to fail and the transfer to be reverted.
The function will revert all transfers of fee-on-transfer and rebasing ERC20 tokens, making them unusable in this system.
To address this issue, the protocol should modify the _transfer function to properly handle fee-on-transfer and rebasing tokens. One possible solution is to use the actual transferred amount (which may be less than the sent amount due to fees) when performing the balance checks, rather than the sent amount.
Valid medium, there are disruptions to the ability to take market actions. The following functions will be disrupted without the possibiliy of reaching settlement, since the respective offers cannot be created/listed regardless of mode when transferring collateral token required to the CapitalPool contract or when refunding token from user to capital pool during relisting. So withdrawal is not an issue - `createOffer()` - reverts [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/core/PreMarkets.sol#L96-L102) - `listOffer()` - reverts [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/core/PreMarkets.sol#L355-L362) - `relistOffer()` - reverts [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/core/PreMarkets.sol#L515-L521) - `createTaker()` - reverts [here](https://github.com/Cyfrin/2024-08-tadle/blob/04fd8634701697184a3f3a5558b41c109866e5f8/src/core/PreMarkets.sol#L831-L836) I believe medium severity is appropriate although the likelihood is high and impact is medium (only some level of disruption i.e. FOT tokens not supported and no funds at risk)
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.