I’ve been staking ETH for almost two years now, and I want to share what I’ve learned about properly recording staking rewards in Beancount. Fair warning: this gets tax-complicated because a single staking reward actually creates two separate tax events. I learned this the hard way during my first tax season with staking income.
The Core Problem
When you receive a staking reward, the IRS sees it as:
- Ordinary income at the moment you gain “dominion and control” over the tokens (taxed at your income rate, 10-37%)
- A capital gain or loss when you eventually sell those tokens (taxed at 0-20% if held >1 year)
The fair market value (FMV) at the time you receive the reward becomes both your taxable income AND your cost basis for future capital gains calculations. This is per IRS Revenue Ruling 2023-14.
My Account Structure
Here’s how I set up my accounts:
; Staking-related accounts
2024-01-01 open Assets:Crypto:Staking:ETH ETH
2024-01-01 open Income:Crypto:Staking:ETH USD
2024-01-01 open Assets:Crypto:Wallet:ETH ETH
; For tracking when I sell
2024-01-01 open Income:Crypto:CapitalGains:ETH USD
Recording a Staking Reward
When I receive a staking reward, I record both the asset acquisition AND the income recognition:
2025-11-15 * "ETH Staking Reward - Validator Payout"
Assets:Crypto:Staking:ETH 0.0032 ETH {2847.50 USD, 2025-11-15}
Income:Crypto:Staking:ETH -9.11 USD
Notice a few important things:
- The
{2847.50 USD, 2025-11-15}creates a specific lot with cost basis and acquisition date - The income amount (0.0032 ETH × $2,847.50 = $9.11) is what I’ll report on Schedule 1
- Each reward gets its own lot, which is crucial for future capital gains tracking
Why Lot Tracking Matters
When I eventually sell staking rewards, Beancount’s lot tracking shines. Let’s say ETH goes to $4,000 and I sell some of my staking rewards:
2026-06-15 * "Sell staking rewards - held >1 year"
Assets:Crypto:Staking:ETH -0.0032 ETH {2847.50 USD, 2025-11-15}
Assets:Bank:Checking 12.80 USD
Income:Crypto:CapitalGains:ETH -3.69 USD
Since I held for more than a year, this is a long-term capital gain of $3.69, taxed at the preferential 0-20% rate instead of ordinary income rates.
The Full Picture
So that single staking event results in:
- 2025 taxes: $9.11 ordinary income (reported on Schedule 1)
- 2026 taxes: $3.69 long-term capital gain (reported on Form 8949 and Schedule D)
Important 2025 Update
Starting in 2025, the IRS eliminated the “universal wallet method” - you can’t treat all your ETH across different wallets as one pool anymore. Each wallet/account needs separate cost basis tracking. Beancount’s natural structure actually handles this perfectly since we’re already tracking by specific accounts.
Questions for the Community
-
How do you handle locked staking rewards (like during the pre-Merge ETH staking period)? I’ve been taking the position that locked rewards aren’t taxable until accessible, but I’d love to hear other approaches.
-
What price sources do you use for FMV? I’ve been using CoinGecko’s API for daily close prices, but I’m curious what others prefer.
-
Anyone have a good importer for pulling staking data automatically from various validators?
Would love to hear how others are handling this. The intersection of crypto and taxes is messy, but Beancount’s lot tracking has made it manageable for me.