Staking refers to sending coins to a third party and receiving rewards in return. This third party is commonly called a "Staking Pool". You still have control over the coins sent into the staking pool so for the most part such sends/receives are not taxable.

You will most often participate in staking when:

  • Delegating your tokens to secure the network

  • Locking governance tokens for voting power (common in decentralized exchanges)

  • Farming your LP tokens (shares in liquidity pools) for additional rewards

If you were participating in liquidity pools, be sure to check out our article about Liquidity in/outย as well

In this article:

Receiving (claiming) staking rewards

Whenever you receive a reward, you should tag the Deposit transaction as a "Reward". This way Koinly will be able to summarize all reward transactions in your Income report so you can declare it in your tax returns.

โ˜ Staking rewards should be tagged with the "Reward" label, not "Received from Pool"

Sending coins into a staking pool

For blockchains with native staking (Zilliqa, Elrond, etc.) and staking on centralized exchanges (Binance, Kraken) Koinly will not import such transactions since these are not taxable.

However, in most DeFi-related staking (on Ethereum or Binance Smart Chain) these transactions will get imported as withdrawals. You need to locate these and tag them as "Sent to Pool" to prevent gains from being realized on them.

Receiving coins from a staking pool

Similar to the sent-to-pool transactions, Koinly will avoid importing these transactions for most blockchains since they are simply returning your own coins back to you and the transaction is unlikely to be taxable.

Similarly, for DeFi transactions involving ERC-20, BEP-20, etc. these transactions will get imported as deposits. You should find and tag such transactions as "Received from Pool".

The Pool wallet

After you use the pool label for the first time, a special wallet is created in Koinly - it will have the same name as your wallet, but a different, blue icon.

The "Sent to/Received from Pool" labels should be used when you "set aside" your assets - meaning that they are leaving your wallet now, but you will get back the same asset in the same amount in the future.

That is why you can only "Receive from Pool" as much as you "Sent to Pool", not more. If you take out from the pool wallet more than you sent there, you will see a Missing purchase history warning.

FAQ

How to handle auto-compounding pools?

Some staking pools (i.e. PancakeSwap's CAKE pool) are accumulating rewards (reward payments are received from the pool along with initial investment). This complicates things as the accumulating rewards are not reported as transactions on the blockchain, so Koinly cannot import them automatically.

๐Ÿ”ต Example: You've sent 1 ETH into a pool and received 1.10 ETH back from the pool. If you were to mark the first transaction as Sent to Pool and the second one as Received from Pool then you would see a missing purchase history error for the 0.10 ETH:

๐ŸŸข Solution: To resolve this error, you need to add a deposit equal to the missing amount (the accumulated rewards) into the pool wallet (๐ŸŸฆ blue icon) right before the "Received from Pool" transaction.

After adding this transaction, the "Missing purchase history" warning disappears:

How to handle AAVE staking tokens like STKAAVE?

When you stake coins with the AAVE protocol, it will give you back a new token that represents your ownership of the staked token (this type of token is often called liquid staking derivative, LSD).

Because you are receiving a token representing your staked asset, such transactions will appear in Koinly as trades (which may result in taxable gains). You can tag them as Swaps to remove any gains from them (if you believe they are exempt from taxes).

How to handle crowdloans?

Polkadot's crowd loans, since you are "lending" your tokens to the protocol and will get your tokens back in the future, should use "Sent/Received from Pool" labels just like other staking transactions.

Did this answer your question?