Koinly currently supports Liquidity transactions carried out on the Ethereum, Binance Smart Chain, Polygon, Avalanche, Fantom, Cronos, Arbitrum, and a few other EVM blockchains. We are working on adding support for other blockchains such as Solana and Osmosis.

Liquidity transactions are imported and tagged as Liquidity in/out automatically.

In this article:

DeFi protocols supported by Koinly

We currently support a number of liquidity protocols such as:

  • Balancer Pool

  • Uniswap V2

  • Sushiswap

  • Sakeswap

  • Snowswap

  • Mooniswap

  • Curve.fi

  • Spookyswap

  • Bancor

  • yearn Finance

  • PancakeSwap

  • Value

  • Cream

  • 1inch

  • Beethoven

  • and about 100 more!

This list is ever-increasing. If your transactions are not being recognized as liquidity automatically then send us a feature request via our Feedback Portal!

We do not currently support Uniswap V3 - you will need to use our manual method described below for those transactions. Make sure to upvote support for UniV3 on our Feedback Portal

Common questions

Are liquidity transactions taxable?

There's a lot of debate around this, by default we treat these as taxable since you are exchanging your tokens for some LP tokens which can be traded or staked to earn more coins.

However, if you feel that such liquidity transactions should not be taxed then you can toggle OFF "Realize gains on liquidity transactions" on the Settings page.

My liquidity transactions are showing up as deposits/withdrawals

This can happen if:

  • One of the provided assets is missing the market price

  • This protocol is not supported by Koinly

🔵 Example: if you provide ETH and FOMO as liquidity on Uniswap V2 but Koinly didn't automatically merge this into a "Liquidity In" transaction - there is a Market prices for XYZ are missing warning on one of the withdrawals:

🟢 Solution: Check if both of the provided assets have a market price. Once you set the market price you will be able to merge the 3 transactions 

☝ You do not need to set the worth of the received LP token - market value needs to be set only for the assets you provided to the liquidity pool

🔵 Example: The assets you provided to the liquidity pool both have the market price, but Koinly still didn't merge them into a Liquidity In transaction:

🟢 Solution: If the LP token you're receiving is not recognized by Koinly, it will have a grey icon instead of an orange one. In such cases, Koinly will not be able to merge this into a liquidity transaction - please open a support ticket regarding this, but you will most likely need to use the manual method for this protocol.

Compare the icon of the received LP token in this example (grey, unsupported) and in the previous one (orange, supported):

Liquidity Out transactions have a cost-basis of $0

This is a common issue that can happen if you have farmed (staked) your LP tokens. Koinly will import these farming/staking transactions but they will be shown as regular deposits/withdrawals since this is how the block explorers report them.

To fix this, you can tag these deposits and withdrawals as Sent to Pool and Received from Pool so that Koinly understands that these LP tokens are simply being transferred to a farm or staking pool. You can learn more about this in our article on Staking.

🟢 Solution: An easy way to find all transactions that need to be tagged for each LP token is to:

  • Locate your most recent Liquidity Out transaction

  • Click on the eye icon in transaction details. This will show you all past transactions involving this specific token

  • Filter to see the deposits and withdrawals only

  • All the transactions visible are most likely your staking transactions, as it rarely happens that you send your LP tokens anywhere (you can also check the contract address they're sent to)

  • As such, you can tag all the transactions you see now as "Sent/Received from Pool"

☝ You need to repeat this process for every LP token you had.


If you zapped into the pool, most of the standard transactions happened on the smart contract, without anything related to your wallet. Often you will only have a withdrawal of one asset (i.e. 1 ETH) from your wallet in Koinly, while the rest:

  • Trading 0.5 ETH for another asset

  • Providing liquidity to a liquidity pool

  • Sending the LP token for staking

Is missing, because it didn't happen on your wallet.

In such situations, you need to account for the liquidity manually (see below). Usually, you can ignore the staking transactions whatsoever, as they are not taxable - so you only need to add Liquidity In/Out.

How to add liquidity transactions manually

🔵 Example: You provided 4300 USDC and 1 ETH to a liquidity pool, but the imported LP token is not recognized by Koinly (it has a grey icon instead of an orange one).

🟢 Solution: In Koinly, you can use liquidity placeholder tokens whenever we do not support a specific coin: (LP1, LP2, LP3, etc.)

☝ Use a different LPx for every liquidity pool you participated in. For example LP1 whenever you entered ETH-BNB pool, LP3 for BTC-USDC pool, etc.

To account for this liquidity transaction manually in Koinly, you need to:

  1. Create a manual deposit of an LPx token, the amount should be the same as of the "grey" LP token you received

  2. Merge the deposit of the LPx token with the withdrawals that represent assets you provided to the liquidity pool

  3. Koinly will automatically tag it as "Liquidity In" and split the deposited LPx token among the withdrawn assets

  4. You can now delete the unrecognized token

Uniswap V3 and other protocols that don't provide an LP token

For protocols like UniV3 that don't provide an LP token (UniV3 only gives you 1 NFT when opening the position) step 1 from the instructions above gets tricky. What we recommend is:

  • The first time you enter the said pool, add 100 LPx tokens

  • When you exit the pool completely, withdraw all the LPx tokens you have in your balance

☝ If you were providing assets to the same liquidity pool multiple times or exiting it partially, you need to calculate the number of LPx tokens added/removed proportionally.

Did this answer your question?