Quick Links

How our system treats DeFi data

TokenTax supports most common Decentralized Finance (DeFi) protocols and platforms automatically, but you may need to manually edit or import transactions if you interacted with unsupported smart contracts.

When our system encounters an unsupported smart contract, it will treat all of the associated transactions as nontaxable deposit or withdrawal transactions by default since it does not know how to correctly label the transactions. This will often result in downstream missing cost basis errors. Consider the following scenario:

  1. You purchase ETH on a centralized exchange and then transfer it to a noncustodial wallet

  2. You swap the ETH for USDC on an exchange like Uniswap

  3. You swap your USDC for another token using an unsupported smart contract

  4. You trade that token back to ETH on Uniswap

Our software will correctly track steps 1, 2, and 4. However, since you interacted with an unsupported contract in step 3, our software will lose track of the cost basis and flag an error on step 4. Manually fixing the transaction in step 3 will resolve the missing cost basis issue.

Notes about terminology/transaction classifications

This article mainly uses examples from L1 Ethereum, but the same principles apply to other integrations like Polygon, BSC, Avalanche, Fantom, etc. To correct issues on other chains, simply substitute the context-specific items for their appropriate counterpart (ETH Transaction would be replaced with MATIC Transaction for Polygon, Etherscan would be replaced with Snowtrace for Avalanche, etc.)

Additionally, this article assumes that you are treating all crypto to crypto trades as taxable events. If you would prefer to treat certain transactions differently, please see our migrations guide for more info.

Adding your wallet

Find your wallet under the Wallets section on our import page.

Swaps, trades, and purchases

Step 1 - Identify the unsupported transaction

In this example I've filtered by the transaction hash for demonstration purposes, but you can also identify unsupported swaps by searching for Deposit transactions in the location ETH Transaction.

Step 2 - Confirm the transaction on Etherscan

Clicking the arrow icon to the right of the Txn Hash field will open the transaction in Etherscan. From here you can view more detailed information, including the contract hash and the function that the transaction is calling.

Typically the name of the function will provide useful information in helping you confirm that the transaction is a swap. The contract hash is useful for quickly finding additional unsupported transactions that need to be corrected and will be used in the next step.

Step 3 - Filter by the contract hash on the All Transactions page

Removing the transaction hash filter and applying the contract hash filter will show all of your interactions with this smart contract. This will allow you to quickly work through the transactions in the next step.

Step 4 - Merge the transactions into a trade

The leftover withdrawal transaction can either be left alone or deleted — our software will ignore deposit and withdrawal transactions when calculating taxes.

Yield farming income

Step 1 - Identify the unsupported transaction

For more information about how to identify unsupported transactions, please see step one in the instructions for fixing swaps.

Step 2 - Confirm the transaction on Etherscan

Please see step 2 in the instructions for fixing swaps for more information about how to interpret Etherscan data. In most cases, yield farming transactions will have function names like getReward() or claim()

Step 3 - Filter by the contract hash in the All Transactions page

In most yield farming transactions, you will only want to edit the income events since deposits into pools are typically not taxable events unless you are required to wrap your principle token in the deposit. If you receive a different token when farming, then your tax authority might interpret that exchange as a taxable event.

In this example we only want to change the reward transactions, so we can use additional filters to make sure we're only selecting what we want to.

Once you have confirmed that you only have the things that you want to edit selected, click the Edit button and change all of the selected transactions into Income events.

Liquidity pool transactions

Liquidity pool transactions are essentially a subset of swap/trade transactions, so please first review the instructions for editing DeFi transactions. This section will start with a filtered contract hash.

Step 1 - Determine the weights

In most cases liquidity pools will have 50/50 weights, but there are some notable examples where different weights are used. For detailed instructions on unbalanced LPs, please see the bottom section of our Balancer pool guide. This example will use 50/50 weights.

Step 2 - Determine the LP token ticker name

In most situations our system will use a naming scheme like UNI-V2-ETH/USDC to label LP tokens, but in some situations the name might be different. It's important that ticker names match, so double check your other transactions to see if your LP token already has a name from a supported contract.

Step 3 - Divide the LP token amount based on the weights

This pool uses 50/50 weights, so we'll want to divide the amount of CRPT in half (18,530.14245) to determine the BuyAmount to use for the edit.

Step 4 - Edit both halves of the LP entrance using the ticker and BuyAmount from previous steps


Airdrops are taxed as income like yield farming rewards. For more information about how to identify and fix unsupported airdrops, please see the yield farming income guide.

For the edit step, you can use the Airdrop transaction type instead of Income for organizational purposes.

Miscellaneous fixes

Crypto (and DeFi in particular) is a difficult topic to cover in a general guide, so we also have some supplemental material for specific fixes.

If your situation is too difficult or time-consuming to handle with manual edits, you also have the option of upgrading to a VIP plan.

Did this answer your question?