Consider supporting ERC-223 token standard and operating with ERC-223 tokens.
The main problem of ERC-20 tokens
The standard lacks “transaction handling model” - transactions of ERC-20 tokens can’t be recognized by the recipient.
As the result, any ERC-20 token can get lost in a contract that failed to recognize an incoming ERC-20 transaction.
On 27 Dec, 2017 there were about $3,000,000 lost: ERC223 token standard · Issue #223 · ethereum/EIPs · GitHub
Today there are more than $20,000,000 lost and this number continues to grow.
Recently a campaign to rescue ERC-20 tokens was launched: https://twitter.com/AaveAave/status/1633126370166575104
However, this is just a temporary solution and ERC-20 tokens will get stuck in contracts again.
The ERC-20 standard is old and it was developed when the token infrastructure was not that big and tokens rarely needed to interact with other contracts. Now it changed.
Please, take a look at the article describing the well-known ERC-20 problems.
ERC-223 token standard solves the issue of stuck tokens and introduces a “communication model”. It is worth noting that ERC-721 transferring mechanism is completely based on ERC-223.
Right now almost all tokens on Ethereum mainnet are ERC-20 and I understand that it will not change overnight. I am working on ERC-20-to-223 Wrapper contract. The contract will allow to create an “upgraded version” for each ERC-20 token and allow holders of ERC-20 tokens to exchange their tokens for ERC-223 tokens at any moment. The ERC-223 tokens will be backed 1:1 by the original ERC-20 that will stay in the contract until a user wants to swap ERC-223 back to ERC-20.
Since the contract will allow to seamlessly swap between ERC-20 and ERC-223 tokens it will be a good idea to convince the users to start using the ERC-223 “version” of the tokens and “upgrade to new standard” to avoid the issues with ERC-20.
There is another advantage of ERC-223 that should be taken into account: it does not require approvals at all. ERC-223 tokens can be transferred to contract in just one transaction. In some cases it is more GAS efficient than approve+transferFrom pattern.
And it is more secure to operate with tokens without approving the contract to withdraw all your tokens should it want to.