When maker creates an offer with fee on transfer token exchanging, he will face TransferFailed revert, due to fee on transfer tokens token transfer's bad handle
As we can see from the sponsor's provided compabilities, the protocol is expected co compile with weird ERC20s, that take fee on transfer: - ERC20 (any token that follows the ERC20 standard)
However let's see what happens in scenario where maker decides to call PreMarkets::createOffer
with param CreateOfferParams.tokenAddress == address of ERC20Token that have fee on transfer:
Bob calls PreMarkets::createOffer
with CreateOfferParams.tokenAddress == fee on tansfer ERC20Token
During the execution TokenManager::tillIn
is called and TokenManager::_transfer
is executed
As we can see from the last check in TokenManager::_transfer
the function will revert because of toBalanceAft != toBalanceBef + amount_ (actual toBalanceAft = toBalanceBef +_ amount - transferFee)
DoS if createOffer is called with CreateOfferParams.tokenAddress that have fee on transfer
Manual review
There are 2 steps needed to solve the issue:
Rewrite the _transfer function as shown below:
Add more code logic to return the deposited value(toBalanceAft - toBalanceBef) and if it's < _amount, decrease the _amount and points value in the corresponding offerInfo and stockInfo
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.