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:
⏺️ 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
*️⃣ 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
.
⏹️ 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:
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
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
(sometimesOther
income
orLending
interest
)
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 usedIf 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 asRemove 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
Find the
Remove from Pool
transaction showing the "Missing purchase history" warningCreate 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, ORDelete 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
Add a manual deposit of aWBTC equal to the missing amount (0.003 aWBTC)
Tag the manual deposit as
Reward
ℹ️ stETH rewards
While Koinly won't import stETH rewards automatically, you can:
Go to Lido's website
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
.