Simply put, stablecoins are treated just the same as other crypto. Koinly will assign a cost-basis to all acquired stablecoins and calculate your gains accordingly.
If the cost-basis is lower than the proceeds, then you will realize some profits.
The real question is this:
"Why is the cost-basis lower than the value and is it right?'
We have listed some of the common scenarios below and how/if to fix them.
Small amounts of profit or loss
This is common if you are dealing with USD-based stablecoins but are using a different base currency yourself, such as EUR or GBP.
Since stablecoins are treated the same as any other crypto, the initial value of the coins might be different from the proceeds when you finally dispose of the coins. This is most noticeable when you have been holding stablecoins for a long period but is mainly due to exchange rate fluctuations, which can be over 10% per year.
Example below: The same 1000 USDT sold 4 months later creates a gain, as the rate USD-EUR changed:
Note that wash-sale rules, such as those used in Canada and the UK, can have an impact on these transactions and essentially cause multiple small profits/losses to build up and then be realized in a big chunk once you finally stop re-acquiring the stablecoin within the wash-sale period.
If you are using USD as your base currency, then you will mostly see small amounts of losses being realized when you spend your stablecoins. This is usually due to the fees that you paid when acquiring the coins since those fees can mean that your cost-basis ends up being slightly higher than your eventual proceeds.
Example below: Selling stablecoins at a small loss, due to a previously paid fee which increased the cost basis of the assets:
Missing purchase histories
These errors can result in a large amount of profit being realized and should preferably be fixed.
This happens when Koinly has no record of how you acquired these coins or how much you paid for them. Even though the cost-basis of stablecoins will usually be $1 per coin, Koinly can not simply assume that this is the case as it would not be compliant (there are cases where the cost-basis is lower or the coins were acquired as income or realized profit).
Example below: Because 1869,27 USDT is unaccounted for, buying ETH creates an implausible gain:
To fix this, you need to find the origin of the missing purchase history and fix that. This is most common when transactions are missing but can also happen if you have duplicate or otherwise inaccurate transactions.
See our article on Missing purchase history to learn more
Low cost-basis due to coins being acquired from non-taxable events
This is probably the least common reason for gains on stablecoins. This happens when you have received the coins through a non-taxable event such as a Swap.
There are 3 types of non-taxable events that can lower your stablecoin cost-basis:
Most countries treat trades as taxable events. Tagging a trade as a Swap will tell Koinly to treat the trade as a non-taxable event so the cost-basis of the first asset is simply carried over to the second asset. This can be useful for migrations, rebases, wraps, and other events that might not be considered taxable events in your country.
It is however very rare that this label can be used for trades where an asset is sold for a stablecoin as these trades would probably always be considered taxable events. If you have tagged such a trade as a Swap then it is probably not correct and the label should be removed.
Example below: Because the trade on Nov 12th was tagged as a swap, ADA's cost basis was directly inherited by the USDT:
This only applies when the setting realize gains on liquidity transactions is turned off.
When this setting is turned off, all liquidity transactions are treated as Swaps so this can result in the same situation as described above
Example below: With "Realize gains on liquidity transactions" toggled OFF, Liquidity Out transactions behave as if a swap fee was applied, hence the cost basis is transferred directly to the new asset
Reward/Interest/Mining/Airdrops not being treated as income
There are a handful of countries that allow staking, earning, or lending income to be taxed as capital gains upon disposal instead of being taxed as income. Koinly has special settings for these that can be toggled as needed ('Treat rewards as income' etc.). When the setting is toggled off, any coins received as a Reward will be assigned a cost basis of $0. While it is unusual to receive a stablecoin from these earning programs, it is still possible and this causes the cost basis of the received stablecoins to be $0
Example below: With "Treat rewards as income" toggled OFF, the cost basis of received rewards is $0: