Tadle

Tadle
DeFiFoundry
27,750 USDC
View results
Submission Details
Severity: medium
Valid

Fee-On-Transfer token can't be supported because balance decrease by fee on transfer even if that token follows the ERC20 standard.

Summary

Fee-On-Transfers token can be considered tokens in scope for tadle.

Contest detail includes supported tokens `ERC20 (any token that follows the ERC20 standard)`.

Vulnerability Details

When a user transfers fee-on-transfer tokens, a portion of the tokens is automatically taken as a fee. For example, if a token has a 1% transfer fee, sending 100 tokens would result in the recipient receiving only 99 tokens, with 1 token being taken as the fee

There exist fee-On-transfer tokens that follows ERC20 token standard.

However `_transfer` function checks if amount is equal to difference between balance before and after transfer.

_safe_transfer_from(_token, _from, _to, _amount);
uint256 fromBalanceAft = IERC20(_token).balanceOf(_from);
uint256 toBalanceAft = IERC20(_token).balanceOf(_to);
@> if (fromBalanceAft != fromBalanceBef - _amount) {
revert TransferFailed();
}
@> if (toBalanceAft != toBalanceBef + _amount) {
revert TransferFailed();
}

Therefore, all transactions for fee-on-transfer can be reverted due to exact balance validation.

Impact

Fee-on-Transfer tokens can't be supported at all by the protocol.

Tools Used

Manual review

Recommendations

Please check all Weird tokens and update code according to supported tokens by the protocol.

or please remove Fee-On-Transfer token in the Whitelist token list.

Updates

Lead Judging Commences

0xnevi Lead Judge 12 months ago
Submission Judgement Published
Validated
Assigned finding tags:

finding-TokenManager-FOT-Rebasing

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)

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.