Skip to main content
Staking and farming tokens

How to document transactions in Koinly when tokens are sent to the staking pool, for farming, etc.

Jack avatar
Written by Jack
Updated over a month ago

Staking refers to sending coins to a third party and (while the tokens are staked) receiving rewards in return. This third party (often a smart contract) has limited control over your assets while they are there, which is why many accountants consider those transactions non-taxable. This article describes how to adjust those transactions in Koinly so they don't generate gains/losses.

You will most often participate in staking when:

  • Delegating your tokens to secure a PoS network

  • Locking governance tokens for voting power

  • Farming LP tokens ("shares" in liquidity pools) for additional rewards.
    Note: most LP farming is handled automatically as of February 2024

🚨 Don't use pool tags for LPing

If you were participating in liquidity pools, you shouldn't be using pool tags as you may receive different assets and in different amounts than you provided - check the article about Liquidity Providing instead

Standard flow when staking tokens

Usually, the process of staking can be divided into three distinct steps:

  1. ⏺️ Staking

    • You send your assets to a 3rd party

    • This transaction shows as a withdrawal in Koinly.

    • To document that "I am sending those tokens out of my wallet but I will receive back the same tokens in the same amount in the future", tag this withdrawal as Add to Pool

  2. *️⃣ Claiming rewards

    • Periodically, you will receive rewards for staking your assets.

    • When those rewards are deposited in your wallet, you should tag them as Reward.

  3. ⏹️ Unstaking

    • When you decide to unstake, your initial funds (principal) are returned to your wallet

    • This transaction will show in Koinly as a deposit.

    • To document that those are the same assets you previously "set aside", tag such deposits as Remove from Pool

🎥 Showcase: Standard flow of staking

The video below shows the usual parts of staking and how to tag them in Koinly:

Automated handling of staking transactions

Koinly handles staking for a number of different blockchains/exchanges/protocols and automatically assigns tags 🪄. This is true for:

  1. Most PoS chains (Cosmos, Celestia)

    • Koinly will skip (won't import) staking and unstaking transactions

    • Staked funds simply remain in your main wallet

    • Rewards are imported and automatically tagged as Reward

  2. Centralized exchanges (Kraken, Binance, ByBit)

    • Koinly will skip (won't import) staking and unstaking transactions

    • Staked funds simply remain in your main wallet

    • Rewards are imported and automatically tagged as Reward (sometimes Other income or Lending interest)

  3. LP token farming on supported protocols (Uniswap, Pancake)

    • Most "V2-style" LP protocols are supported automatically

    • Koinly will automatically tag staking (farming) transactions as Add to Pool

    • Koinly will automatically tag unstaking transactions as Remove from Pool

    • Koinly will automatically tag deposits of rewards from farming as Reward

The pool wallet

The pool tag is a special kind of tag in Koinly. When you use the pool tag:

  • Koinly creates a new wallet (a subwallet) with the same name as the "parent" wallet (unless it's already created for this wallet)

  • The transaction with the pool tag is automatically edited into a transfer to this subwallet

  • The pool wallet has the same name as the main wallet when the first Add to Pool tag was used

  • If you rename the "parent" wallet, the pool wallet's name doesn't update

  • The pool wallet is hidden from the "Wallets" page but can be accessed e.g. from the Dashboard (if you have any funds in the pool wallet). It will be listed at the bottom of the "Complete" tax report among other wallets

  • Pool wallet has a small blue circle 🔵 in the bottom right corner

ℹ️ Pool wallet in- and outflows

Since the pool wallet is de facto a normal wallet in Koinly, you should only Remove from Pool (unstake) as much as you previously Added to Pool (staked). Otherwise, "Missing purchase history" warning will show, indicating that Koinly doesn't know how the asset appeared in the pool

Advanced scenarios

Auto-compounding pools

Some staking pools (e.g. Pancake's CAKE pool, SOL staking on Solana) are accumulating rewards (rewards are deposited to the staking pool along your initial investment). The rewards are then claimed together with the principal and sent to your wallet, causing "Missing purchase history" warnings.

To resolve this, add a missing amount as a deposit with Reward tag right before the withdrawal

🔵 Example: You staked 50 SOL on a Solana wallet

  • You delegated 50 SOL for staking

  • When unstaking, received 50.50 SOL back.

  • If you tag the first transaction as Add to Pool and the second one as Remove from Pool, you will see a missing purchase history error for 0.50 SOL:

🟢 Solution: Add the accrued reward as a deposit with Reward tag

  1. Find the Remove from Pool transaction showing the "Missing purchase history" warning

  2. Create a manual deposit in Koinly:

    • Amount: exactly the amount that is shown on the "Missing purchase history" warning

    • Date: sometime before the Remove from Pool transaction (e.g. 5 minutes earlier)

    • Receiving Wallet: the pool wallet (same name as parent wallet but with a blue circle in bottom-right)

    • Tags: Add Reward tag to this deposit

☝️ Depositing the accumulated rewards monthly/weekly/daily

Depending on what your accountant advises, you may need to add these rewards periodically during the staking period, not just add one lump sum at the end

🎥 Showcase: Auto-compounding pools

See the video below for all the steps needed when dealing with auto-compounding pools:

Self-appreciating derivatives ("cTOKENS") - cUSDC, wstETH

Some lending protocols like AAVE, when you provide capital, send you a "receipt" token representing your staked asset. This asset is self-appreciating, meaning that the amount of underlying asset associated with the receipt token increases with time.

🔵 Example: You loaned 100 USDC in a lending protocol

  • You provided 100 USDC and received 100 cUSDC

  • When unstaking this 100 cUSDC you received 101 USDC

🟢 Solution: Needs adjustments if deemed non-taxable

You are receiving a new token representing your staked asset so this will be a trade in Koinly (which may result in gains/losses).

Pool tags cannot be applied to trades (only to deposits/withdrawals) so if you believe this transaction shouldn't be taxable, you can:

  • Tag the trade as Swap to stop gains from being calculated, OR

  • Delete the cTOKEN part of the trade (turning it into a deposit/withdrawal) and then use the pool tags

    • As you will be unstaking more than you staked, follow the auto-compounding scenario above

Self-rebasing derivatives ("aTOKENS") - stETH, aUSDC, aWBTC

Some protocols offer derivatives that are pegged in price with the underlying asset (can always be exchanged at 1:1 ratio) and interest is distributed in the form of rebasing - the amount of token you hold constantly increases just by owning the token.

Since those rewards are not distributed as transactions on the blockchain (just a state change on the smart contract) Koinly won't import them automatically and you need to add the missing amount as deposits tagged as rewards - see the article about reflection and rebasing tokens for details.

🔵 Example: You purchased 1.50 aWBTC

  • You hold 1.50 aWBTC in your Ethereum wallet

  • After a month, you sync your wallet in Koinly and see that the calculated balance remained 1.50 aWBTC but the reported balance is 1.503 aWBTC

🟢 Solution: Add excess as reward

  1. Add a manual deposit of aWBTC equal to the missing amount (0.003 aWBTC)

  2. Tag the manual deposit as Reward

ℹ️ stETH rewards

While Koinly won't import stETH rewards automatically, you can:

  • Paste your public key and click Enter

  • Click the "Export CSV" to download the CSV with your rewards

  • Import this file to Koinly to the same wallet that holds stETH
    We support this file automatically, no need to edit it.

Polkadot crowdloans

Polkadot's crowdloans, since you are "lending" your tokens to the protocol and will get your tokens back in the future, should use Add/Remove from Pool tags just like other staking transactions.

Any additional tokens you received would be Rewards.

Did this answer your question?