How to Record DeFi Yield Moves for Taxes
What You Are Documenting And Why It Matters

When you move a yield position from one protocol to another, you generate between two and six taxable events depending on how you execute the migration. Most people document it as a single transfer. That works until an auditor asks for the cost basis of your withdrawal, the fair market value at redeposit, and the timestamp proving your categorization.
The IRS now requires wallet-level cost basis assignment and FIFO treatment unless you specifically identify lots in a written statement. That requirement started January 1, 2025. If you moved USDC from Fluid to Compound this week and did not document which specific units you withdrew, you defaulted to FIFO. If you later claim a different lot assignment, you need contemporaneous written proof.
This guide walks through the documentation protocol that survives an audit. You will learn the transaction categories both CoinTracker and CoinLedger recognize, the specific fields required for each step of a migration, and the template structure accountants expect when they reconcile your DeFi activity against Schedule 1 and Form 8949.
Prerequisites
You need wallet addresses for both the source and destination protocols, transaction hashes for every on-chain step, and either a paid CoinTracker account or CoinLedger subscription with DeFi transaction import enabled. Free tiers cap transaction limits below what most multi-protocol users generate in a quarter.
If you are running more than five yield positions simultaneously, the documentation process described here should be part of a broader position record system that logs every protocol interaction, not just migrations.
Transaction Categorization Schema That Works Across Platforms

CoinTracker and CoinLedger use different category labels for the same economic events. A withdrawal from Aave appears as “Unstake” in CoinTracker but “Withdraw” in CoinLedger. If you export from one platform and import to another mid-year, inconsistent categorization flags false discrepancies.
Use this standardized schema. Both platforms accept manual overrides that map to these categories.
Core Categories for Yield Position Movements
Withdrawal from lending protocol: Label as “Unstake” if the protocol issued receipt tokens (aUSDC, cUSDC). Label as “Withdraw” if it did not. CoinTracker auto-categorizes most Aave and Compound withdrawals correctly. CoinLedger often defaults to “Receive” and requires manual correction.
Deposit to lending protocol: Label as “Stake” for receipt-token protocols. Both platforms recognize this category. If the deposit involved a token swap before staking, split it into two transactions: “Trade” for the swap, then “Stake” for the deposit.
LP token deposit: Label as “Liquidity In” or “Add Liquidity.” This is a taxable exchange in the US because you trade two tokens for an LP token. Document the fair market value of both input tokens at the block timestamp. Most automated imports miss this valuation step.
LP token withdrawal: Label as “Liquidity Out” or “Remove Liquidity.” Taxable disposal of the LP token. You realize gain or loss based on the value of tokens received versus the cost basis of the LP token burned.
Claiming accrued yield: Label as “Staking Reward” or “Interest Income.” This generates ordinary income at the token’s fair market value when you gain dominion and control. For Aave and Compound, that is the block when you withdraw, not when interest accrues.
Inter-wallet transfer: Label as “Transfer” or “Asset Migration.” Not taxable if both wallets are yours. Link the outgoing and incoming transactions as a matched pair using transaction hashes. If you cannot prove both wallets belong to you, the IRS may treat the outgoing transaction as a disposal.
Critical Fields Every Transaction Record Needs
Date and time in UTC with block timestamp. The IRS accepts UTC; your tax software may convert to local time zones. Use the blockchain timestamp, not when you clicked confirm in MetaMask.
Transaction hash. Non-negotiable for audit defense. If you claim a transaction occurred, the hash is proof.
Wallet addresses for sender and receiver. If you moved funds from Wallet A to Wallet B before depositing to Compound, document both hops. Missing the intermediate wallet makes it look like Wallet B received funds from nowhere, which the IRS may classify as income.
Token quantity and ticker. Specify decimals. “1000 USDC” is clear. “1000.000000 USDC” matches on-chain precision and eliminates rounding disputes.
Fair market value in USD at the block timestamp. CoinTracker and CoinLedger pull pricing from different sources. Lock in the valuation contemporaneously. If the IRS challenges your cost basis three years later, you cannot retroactively change the price source.
Gas fees in ETH and USD. Deductible as transaction costs for capital gains calculations. Most people forget to add gas to their cost basis, which overstates gains.
How CoinTracker Handles DeFi Versus CoinLedger
CoinTracker auto-categorizes about 70% of mainnet Aave, Compound, and Uniswap transactions correctly. It recognizes receipt tokens, matches deposits to withdrawals, and applies “Staking Reward” labels to most yield claims. L2 chains require more manual cleanup. Arbitrum and Optimism transactions often import as generic “Receive” until you recategorize them.
CoinLedger requires manual recategorization on 40% to 50% of DeFi transactions. Its auto-import treats LP deposits as simple sends, which misses the taxable exchange component. The CoinTracker platform costs $199/year for most active DeFi users. CoinLedger is cheaper but demands more manual work.
Neither platform handles bridging well. If you migrated USDC from Ethereum to Arbitrum, then deposited to a lending protocol on Arbitrum, you must manually link the bridge transaction to the deposit. The bridge itself is not taxable (same asset, same amount), but if you fail to link it, your Arbitrum wallet shows USDC appearing from nowhere.
Step-by-Step Documentation for a Protocol-to-Protocol Migration

This example uses a real migration that occurred this week: moving USDC from Fluid to Compound on Ethereum mainnet. The principles apply to any lending protocol switch.
Step 1: Withdraw from the Source Protocol
You initiated a withdrawal of 10,000 aUSDC from Fluid. Fluid burned the aUSDC and sent you 10,050 USDC. The extra 50 USDC is accrued interest.
Transaction 1 – Burn receipt token:
Category: Unstake
Token out: 10,000 aUSDC
Fair market value: $10,050 (the redeemable value in USDC)
Date/time: Block timestamp
Wallet: [Your address]
Transaction hash: [TX hash]
Gas: [ETH amount] / [USD value]
Transaction 2 – Receive underlying asset:
Category: Staking Reward (for the 50 USDC interest), Unstake (for the 10,000 USDC principal)
Token in: 10,050 USDC
Fair market value: $10,050
Cost basis: $10,000 (your original deposit) + gas
Date/time: Same block as Transaction 1
Wallet: [Your address]
Transaction hash: Same hash
Notes: “Fluid withdrawal: 10,000 principal + 50 interest. Interest taxable as ordinary income per Schedule 1.”
The 50 USDC interest is ordinary income. Report it on Schedule 1 as “Other Income” at $50. The return of your 10,000 USDC principal is not income; it is a return of capital. If you paid $10,000 originally and withdrew $10,000, you have zero capital gain on the principal.
Step 2: Transfer to Compound (If Using a Different Wallet)
If you withdrew to Wallet A and are depositing from Wallet B, document the transfer between your wallets.
Transaction 3 – Send:
Category: Transfer
Token out: 10,050 USDC
From wallet: [Wallet A address]
To wallet: [Wallet B address]
Transaction hash: [TX hash]
Gas: [ETH] / [USD]
Notes: “Internal transfer to consolidate for Compound deposit. Both wallets owned by [Your name/entity]. Not a disposal.”
Transaction 4 – Receive:
Category: Transfer
Token in: 10,050 USDC
From wallet: [Wallet A address]
To wallet: [Wallet B address]
Transaction hash: Same as Transaction 3
Notes: “Link to TX [Transaction 3 hash]. Internal transfer, non-taxable.”
Link these two records explicitly. In CoinTracker, use the “Ignored” pairing feature. In CoinLedger, tag both as “Transfer” and reference the matching hash in notes.
Step 3: Deposit to the Destination Protocol
You deposited 10,050 USDC to Compound v3 and received 10,050 cUSDCv3 receipt tokens.
Transaction 5 – Deposit underlying asset:
Category: Stake
Token out: 10,050 USDC
Fair market value: $10,050
Date/time: Block timestamp
Wallet: [Wallet B address]
Transaction hash: [TX hash]
Gas: [ETH] / [USD]
Transaction 6 – Receive receipt token:
Category: Stake
Token in: 10,050 cUSDCv3
Fair market value: $10,050
Cost basis: $10,050 (equal to the USDC you deposited)
Date/time: Same block as Transaction 5
Transaction hash: Same hash
Notes: “Compound v3 deposit. Receipt token cUSDCv3 is not separately taxable; tracks claim on underlying USDC.”
Receiving the cUSDCv3 token is not a taxable event if you treat it as a receipt, not a distinct asset. The IRS has not issued explicit guidance on this. The two interpretations are:
Receipt interpretation: The cUSDCv3 represents your claim on deposited USDC. Receiving it is non-taxable. You realize gain or loss when you withdraw and redeem the receipt token.
Exchange interpretation: Depositing USDC and receiving cUSDCv3 is a taxable trade. You dispose of USDC and acquire cUSDCv3 at equal fair market value, generating zero gain or loss unless pricing diverges.
Most DeFi users and accountants apply the receipt interpretation. If you choose this method, apply it consistently across all protocols. Switching interpretations between Aave, Compound, and Fluid will trigger audit flags.
Linking the Full Migration Sequence
Your tax software will import six transactions. If you do not link them, it treats each as independent. The withdrawal looks like you sold 10,000 aUSDC. The deposit looks like you acquired 10,050 cUSDCv3 from nowhere. Your net income appears inflated by $20,100.
In CoinTracker, use the “Add Note” field on Transaction 1 to reference Transactions 2 through 6. Write: “Part of Fluid-to-Compound migration. See TX [hash list]. Total taxable income from this sequence: $50 (interest only).”
In CoinLedger, create a manual “Asset Migration” entry that groups all six transactions under a single parent event. Not all users have access to this feature; it is gated behind the $299/year tier.
Edge Cases And How To Document Them
Wrapped and Unwrapped Tokens
If you withdrew USDC from Fluid, wrapped it to yield-bearing stUSDC, then deposited stUSDC to a different protocol, you added a taxable swap in the middle of your migration. Wrapping USDC to stUSDC is not exempted by Notice 2024-57 because stUSDC accrues value through rebasing or appreciation. The notice exempts only wrappers that maintain 1:1 parity with no yield accrual.
Documentation:
Transaction A: Unwrap/withdraw USDC from Fluid (documented as above).
Transaction B: Trade USDC for stUSDC. Category: Trade. Calculate gain or loss if the exchange rate diverged from 1:1.
Transaction C: Deposit stUSDC to the new protocol. Category: Stake.
Do not label Transaction B as “Wrap” unless the token maintains exact 1:1 parity with zero accrual. Most tax software does not recognize “Wrap” as non-taxable by default.
LP Token Migrations
Moving a liquidity position from Uniswap V3 to Aerodrome requires four taxable steps: withdraw liquidity (dispose of LP token, realize gain/loss), receive the two underlying tokens, deposit the two tokens to the new pool (dispose of both, realize gain/loss), receive new LP token.
Documentation:
Transaction 1: Remove liquidity. Category: Liquidity Out. Token out: [LP token]. Calculate gain or loss: (FMV of tokens received) minus (cost basis of LP token).
Transaction 2: Receive Token A and Token B. Category: Trade (linked to Transaction 1).
Transaction 3: Deposit Token A and Token B to new pool. Category: Liquidity In. Calculate gain/loss on Token A: (FMV at deposit) minus (cost basis). Same for Token B.
Transaction 4: Receive new LP token. Category: Liquidity In. Cost basis equals total FMV of tokens deposited.
This generates two separate capital gain or loss events. If Token A appreciated 5% between withdrawal and redeposit, you owe tax on that gain even though you never cashed out.
Cross-Chain Migrations via Bridges
Bridging USDC from Ethereum to Arbitrum, then depositing to an Arbitrum-based protocol, creates a documentation gap unless you explicitly link the bridge to the deposit.
Documentation:
Transaction 1: Send USDC to bridge contract on Ethereum. Category: Transfer (not Trade). Token out: USDC on Ethereum. Notes: “Canonical bridge to Arbitrum. Non-taxable transfer of same asset across chains.”
Transaction 2: Receive USDC on Arbitrum. Category: Transfer. Token in: USDC on Arbitrum. Link to Transaction 1 via bridge transaction ID.
Transaction 3: Deposit USDC to Arbitrum protocol. Category: Stake.
If the bridge issued a wrapped asset (e.g., USDC.e instead of native USDC), that is a taxable trade. Most canonical bridges now issue native assets post-Arbitrum’s token upgrade, but older bridges still issue wrappers.
Claiming Rewards Mid-Migration
If you claimed $120 of COMP rewards after withdrawing from Fluid but before depositing to Compound, document the claim separately.
Transaction:
Category: Staking Reward
Token in: [X] COMP
Fair market value: $120
Date/time: Block timestamp
Notes: “COMP reward claim from Compound v3 prior positions. Ordinary income per Schedule 1.”
Do not merge this into your migration documentation. Reward claims are ordinary income events independent of the migration.
Proof Requirements That Survive An Audit
An auditor will ask for three categories of proof: transaction authenticity, wallet ownership, and fair market valuation source.
Transaction Authenticity
Provide transaction hashes and Etherscan (or equivalent block explorer) links for every on-chain event. The blockchain is self-authenticating. If the hash exists and shows your wallet address, the transaction is verified.
For CeFi off-ramps (withdrawing from a DeFi protocol to Coinbase, then cashing out), include the exchange’s transaction export CSV. CeFi platforms issue 1099-B forms starting in 2025 for sales and exchanges. Your records must match their filing.
Wallet Ownership
If you transferred funds between wallets you control, you must prove you own both. The IRS does not accept “I own both wallets” as sufficient. Proof methods:
Signed message: Use your wallet to sign a message stating “I, [Your Name], control wallet [0x…] and wallet [0x…] as of 2026.” Store the signature and message hash. Most hardware wallets support message signing via Etherscan or Metamask.
Consistent control history: Show repeated transactions between the two wallets over time. A single transfer could be a payment to someone else. Twenty transfers over six months establishes control.
Accountant attestation: If you work with a crypto-specialized accountant, have them include a signed statement in your tax file: “Based on client representations and transaction review, [Wallet A] and [Wallet B] were under client control during tax year [year].”
Fair Market Valuation Source
The IRS requires “reasonable valuation methods consistently applied.” Lock in your pricing source and use it across all transactions. If you valued USDC at $0.9998 in March using Coinbase’s API, do not switch to Kraken’s $1.0002 rate in April because it lowers your gain.
CoinTracker pulls from multiple sources and applies a weighted average. CoinLedger uses CoinGecko. Both are acceptable, but if you switch platforms mid-year, you introduce inconsistencies. Export your complete transaction history with locked-in valuations before switching.
For tokens without centralized exchange pricing (e.g., LP tokens), use the sum of the underlying assets’ values. If you hold 10 ETH-USDC LP tokens representing 0.5 ETH ($1,200) and 1,200 USDC ($1,200), your LP token value is $2,400.
The Tax Forms Your Documentation Feeds Into
Schedule 1 (Form 1040): Additional Income
Report all DeFi yield as “Other Income” on Line 8z. This includes staking rewards, liquidity pool fees, lending interest, and governance token airdrops. Do not report this on Schedule C unless you qualify as a business (most individuals do not).
For the Fluid-to-Compound migration example above, you report $50 on Schedule 1. That is the only taxable income from the migration. The rest of the transactions are position reallocations.
Form 8949: Sales and Dispositions of Capital Assets
Report every capital gain or loss event here. For DeFi migrations, this includes LP token disposals and any token swaps mid-migration. If you withdrew from a Uniswap pool and realized a $300 gain on the LP token, report it on Form 8949 with description “Disposal of Uniswap V3 ETH-USDC LP token.”
If you had zero gain or loss (e.g., depositing USDC to Compound and receiving cUSDC at equal value), you still report the disposal. Enter the transaction, show cost basis equal to proceeds, and the gain column shows $0. This avoids IRS matching algorithms flagging an unreported disposal.
Schedule D: Capital Gains Summary
Aggregate all Form 8949 entries here. Short-term gains (positions held under one year) go in Part I. Long-term gains (over one year) go in Part II.
For most DeFi users, yield position migrations generate short-term events because you reallocate capital frequently. If you deposited USDC to Aave 14 months ago and just withdrew, your gain on the aUSDC receipt token is long-term. The interest earned over those 14 months is ordinary income (Schedule 1), but appreciation in the receipt token’s redemption value versus your cost basis is long-term capital gain.
Form 1099-DA: Starting 2025
Centralized exchanges and some DeFi frontends will issue 1099-DA forms reporting your digital asset transactions. The IRS will match these forms against your return. If Coinbase reports a $10,000 USDC sale and you do not report it, you get a CP2000 notice.
Your migration documentation must reconcile with any 1099-DA filings. If you withdrew USDC from Fluid to Coinbase, then sold it, Coinbase reports the sale. Your records must show the full chain: Fluid withdrawal (basis = original deposit + accrued interest), transfer to Coinbase (non-taxable), sale on Coinbase (capital gain/loss). If your reported basis does not match Coinbase’s cost basis field on the 1099-DA, explain the discrepancy in Form 8949’s description field.
Documentation Template You Can Adapt
Use this structure for every protocol migration. Store it alongside your tax software export.
MIGRATION RECORD: [Protocol A] to [Protocol B]
Date: [YYYY-MM-DD]
Wallets involved: [List all addresses]
Total taxable income from migration: $[amount]
Total capital gain/loss from migration: $[amount]
STEP 1: Withdrawal from [Protocol A]
TX Hash: [hash]
Block: [number] | Timestamp: [UTC]
Action: Withdraw [amount] [token] from [Protocol A]
Received: [amount] [underlying token]
Cost basis: $[amount]
FMV at withdrawal: $[amount]
Gain/loss: $[amount]
Interest/yield component: $[amount] (ordinary income)
Gas: [ETH] / $[USD]
STEP 2: [Optional – Transfer between wallets]
TX Hash: [hash]
Block: [number] | Timestamp: [UTC]
Action: Transfer [amount] [token] from [Wallet A] to [Wallet B]
Notes: Internal transfer. Both wallets owned by [name]. Non-taxable.
Proof of ownership: [Signed message hash or attestation]
Gas: [ETH] / $[USD]
STEP 3: Deposit to [Protocol B]
TX Hash: [hash]
Block: [number] | Timestamp: [UTC]
Action: Deposit [amount] [token] to [Protocol B]
Received: [amount] [receipt token]
Cost basis: $[amount]
FMV at deposit: $[amount]
Tax treatment: Receipt token, non-taxable exchange per [methodology]
Gas: [ETH] / $[USD]
PRICING SOURCE: [CoinTracker/CoinLedger/CoinGecko/API name]
ACCOUNTANT REVIEW: [Date reviewed] by [name/firm]
FILED ON: Schedule 1 ($[amount]), Form 8949 ($[amount])
Where To Store This Documentation
Keep three copies: one in your tax software’s notes field, one in a dedicated tax folder (Google Drive, Dropbox, encrypted local storage), and one with your accountant if you use one. The IRS audit window is three years for most returns, six years if they suspect underreporting over 25%. Store records for seven years to be safe.
If you migrate positions quarterly, you will generate 40 to 60 of these records per year. Tag them by date and protocol pair: “2026-10-15_Fluid-to-Compound.txt”. When your accountant asks for Q3 DeFi activity, you send a folder, not a pile of unsorted transaction hashes.
What To Do Next
If you migrated a position this week and have not documented it yet, do it now while the details are recent. Export the transaction hashes from Etherscan or your block explorer of choice, fill in the template above, and import the transactions to your tax software. Categorize them using the schema in the second section of this guide.
If you use multiple wallets for security or gas optimization, map out which wallets you control and generate signed ownership proofs for each. You do not want to scramble for this proof in year three of an audit.
Set a recurring calendar reminder to document migrations within 48 hours of execution. Waiting until December to reconstruct nine months of position changes is how $5,000 accountant bills happen. Real-time documentation costs you ten minutes per migration. Retroactive reconstruction costs you $200/hour in professional help.
If you are running yield positions across five or more protocols, consider moving from transaction-by-transaction documentation to a position ledger system that logs every protocol interaction automatically. That is the境界線 where manual documentation stops scaling.
The Takeaway
Most DeFi position migrations generate less than $100 in taxable income but produce six-figure audit liability if you cannot prove basis. The documentation cost is ten minutes and zero dollars if you do it contemporaneously. The reconstruction cost is $2,000 to $5,000 in accounting fees and days of your time if you wait until the IRS asks. The template in this guide works because it captures the three proof categories auditors demand: transaction authenticity via hashes, wallet ownership via signed statements, and valuation consistency via locked pricing sources. Apply it to your next migration and you have converted an audit risk into a labeled spreadsheet row.
Frequently Asked Questions
Is moving USDC from Aave to Compound a taxable event?
The movement itself between protocols owned by you is not taxable, but the withdrawal from Aave and deposit to Compound each trigger tax reporting. If you earned interest while in Aave, that interest is ordinary income when withdrawn. The principal return is non-taxable. Depositing to Compound is non-taxable if you treat receipt tokens as claims rather than exchanges. You must document each step with transaction hashes, timestamps, and fair market valuations to prove the position migration and separate taxable income from non-taxable reallocations.
What transaction records do I need to keep for DeFi yield migrations?
You need transaction hashes, block timestamps in UTC, wallet addresses for sender and receiver, token quantities with full decimal precision, fair market value in USD at each transaction, gas fees in ETH and USD, and categorization labels your tax software recognizes. For migrations between your own wallets, include proof of ownership via signed messages or accountant attestation. Store these records for seven years in three locations: your tax software notes, a dedicated tax folder, and with your accountant if applicable.
How do CoinTracker and CoinLedger differ for DeFi tax reporting?
CoinTracker auto-categorizes about 70% of mainnet DeFi transactions correctly and handles Aave, Compound, and Uniswap receipt tokens well, but costs $199/year for active users. CoinLedger is cheaper but requires manual recategorization on 40% to 50% of DeFi transactions and often mislabels LP deposits as simple sends. Neither handles cross-chain bridges or complex LP migrations without manual linking. CoinTracker has better DeFi protocol coverage and an accountant portal. CoinLedger has the best TurboTax export integration but weaker L2 support.
Are LP token deposits and withdrawals taxable events?
Yes. Depositing two tokens into a liquidity pool and receiving an LP token is a taxable exchange because you dispose of two assets and acquire a third. You must report the fair market value of both input tokens at deposit. Withdrawing liquidity is also taxable because you dispose of the LP token and realize gain or loss based on the value of tokens received versus your LP token cost basis. Most tax software does not auto-calculate LP token basis correctly so you must manually track cost basis and link deposit/withdrawal transactions.
What happens if my migration documentation does not match my 1099-DA form?
Starting in 2025, centralized exchanges and some DeFi platforms issue 1099-DA forms reporting your transactions to the IRS. If your reported cost basis differs from the exchange’s 1099-DA filing, the IRS matching algorithm flags a discrepancy and you receive a CP2000 notice. To reconcile differences, use Form 8949’s description field to explain the adjustment, reference your migration documentation with transaction hashes, and show how your basis calculation accounts for the full transaction chain including DeFi protocol deposits, inter-wallet transfers, and accrued yield that the exchange cannot see.
Tool mentioned above
Koinly
Koinly imports from 800+ exchanges and wallets and handles the DeFi cases most tools get wrong – rebasing tokens, LP positions, staking rewards.
We may earn a commission if you sign up through this link, at no cost to you. It does not change what gets recommended.
The Weekly Yield Report
You now have the transaction schema, documentation template, and proof requirements that convert DeFi migrations from audit risks into defendable records. Tax rules and IRS matching algorithms will change next year.
Every Thursday: where crypto yield actually is – stablecoins, liquid staking and DeFi lending, with the risk named next to the rate and what changed since last week.
Free. No trade calls, no allocations, no hype. Unsubscribe in one
click.










