You moved some ETH from an exchange to your hardware wallet — a housekeeping step, nothing sold, no profit taken. Months later you open your crypto tax report and there's a gain sitting on those exact coins. The move you made to be more careful with your crypto is the move that made your tax report wrong.

This is one of the most common questions self-custody users ask, and the answer is reassuring in one way and annoying in another. Reassuring: moving crypto between wallets you own is not, by itself, a taxable event, so the gain your software invented does not reflect anything you actually did. Annoying: fixing it is on you, because the number is wrong for a reason no exchange will correct for you. This guide explains exactly why a self-transfer breaks your cost basis, what "cost basis" is actually attached to, and how to tell whether your own report survived the move.

This is not tax advice. It's an explanation of how the accounting and the software behave, with links to primary sources, so you know which questions to bring to a professional. For decisions about your own return, talk to one.

Moving crypto between your own wallets is not a taxable event

Start with the part that isn't in dispute. When you send crypto from one wallet, address, or account you own to another wallet, address, or account you own, you have not sold or exchanged anything. You still hold the same coins; they're just sitting somewhere else. The IRS treats digital assets as property, and moving your own property from one pocket to another is not a disposition. The agency's digital asset guidance frames a taxable event around a sale or exchange — a self-transfer is neither.

That principle is broadly established, but the way you have to prove it on a return is where people get caught. The tax system doesn't automatically know that the address the coins left and the address they arrived at both belong to you. As far as any automated feed is concerned, coins went out of one place and unrelated coins showed up in another. Whether those two half-events get stitched back into a single non-taxable transfer, or split into a sale plus a mystery acquisition, is a records problem — and it's the whole ballgame.

Because this is a substantiation question rather than a black-and-white rule, the edge cases are worth a professional's eyes: transfers that also pay a network fee in the asset being moved, transfers that route through a bridge or a wrapping contract, or moves between accounts that aren't cleanly "yours" (a shared wallet, a custodial account in someone else's name). Those can carry wrinkles. The plain-vanilla case — your exchange to your cold wallet, your cold wallet to your second exchange — is not a sale.

Cost basis belongs to the coin, not the wallet

Here is the single idea that makes the rest of this make sense: cost basis is a property of the asset, not of the account holding it.

When you buy 1 ETH for $2,000, that $2,000 basis and the acquisition date attach to those coins. If you move them to a hardware wallet, then to a second exchange, then to a third wallet, the basis and holding period ride along the entire way. Nothing about relocating the coins resets what you paid or when you bought them. When you eventually sell, your gain is the sale proceeds minus that original $2,000 — regardless of how many wallets the coins passed through in between.

Software breaks this because software rebuilds your history from disconnected data feeds. Each exchange knows its own deposits and withdrawals. Each wallet is a stream of on-chain sends and receives. A tax tool imports all of them and tries to reassemble one coherent life story for each coin. When it succeeds, a self-transfer nets out to zero and your basis flows through untouched. When it fails — when the withdrawal from account A and the deposit into wallet B aren't recognized as the same coins — the tool does the only thing it can with the fragments it has: it books the withdrawal as a disposal and the deposit as a brand-new acquisition whose purchase price it never saw.

That new acquisition arrives with no basis. And a missing basis is the fuse for the whole problem. If the tool later treats that unknown basis as $0, the next time you sell those coins the entire sale price is taxed as gain — a phantom gain that exists in the report and nowhere in your real financial life.

Why a self-transfer specifically breaks the chain

Not every transfer breaks. The ones that do tend to fall into three patterns, and recognizing them tells you where to look in your own history.

Exchange to self-custody. You withdraw from Coinbase or Kraken to a MetaMask or Ledger address. The exchange records a withdrawal. The blockchain records an incoming transfer to your address. If your tax tool hasn't been told that the receiving address is yours — or if you added the wallet to the tool after the transfer already imported — it sees a coin leaving custody and a coin appearing from nowhere. This is the classic first break, and it's usually the earliest one in a person's history because self-custody often comes after the first purchases.

Exchange to exchange. You move funds from one platform to another to trade or to sell. Two separate exchange feeds, two separate records, no shared identifier that says "these are the same coins." Unless the tool matches the withdrawal amount, timing, and asset across both feeds, the coins land on the second exchange as a fresh, basis-less position. This is the pattern that most often surfaces at sale time, because the second exchange is frequently where the actual selling happens — and where a 1099-DA will later report the disposal with a "transferred in" flag and, quite possibly, a blank cost-basis box.

Wallet to wallet, or through a bridge. You consolidate several self-custody wallets into one, rotate to a new seed phrase, or move assets across chains. Every hop is another opportunity for the tool to lose the thread, and bridges in particular often mint a different token on the destination side, which almost never auto-links to the asset that entered on the origin side.

In each case the underlying tax reality is identical and boring: you still own your coins, nothing was sold, basis is unchanged. The report is wrong not because a rule was broken but because the software's model of your history has a seam in it. Koinly's own support forum is full of these seams — users reporting long-held coins surfacing as short-term gains and missing purchase history after an unlinked transfer. The mechanism is the same across every tool; only the warning label changes.

Why this got more expensive starting in 2025

For years, a broken self-transfer was mostly a reconciliation nuisance you could clean up before filing. Two changes have raised the stakes.

First, the accounting method changed. As of January 1, 2025, US crypto cost basis moved from a universal, portfolio-wide pool to a per-wallet system under Rev. Proc. 2024-28. Basis now has to be tracked wallet by wallet, which means the identity of the wallet a coin lives in is no longer a bookkeeping detail — it's load-bearing. If your basis was allocated to one wallet under the transition snapshot and the coins then moved without their basis following them, the mismatch is exactly the kind of thing per-wallet accounting was supposed to make explicit. The full mechanics are in our guide to the per-wallet cost basis migration.

Second, the reporting changed. Beginning with 2025 sales, brokers issue Form 1099-DA, and for any coin that was transferred in to the reporting exchange, the form is allowed to leave the cost-basis box blank and mark the asset as noncovered. A coin that reached its selling exchange via a self-transfer is, almost by definition, a transferred-in coin. So the same move that confused your tax software is the move that will produce a blank or wrong basis on a federal form — and if a preparer reads that blank as a zero, the phantom gain gets a government wrapper around it.

The through-line: a self-transfer used to break basis quietly inside one app. Now it can break basis in your accounting method and on the form the IRS receives, at the same time, for the same coins.

How to check whether your basis survived the move

You don't have to guess. A self-transfer that broke basis leaves a specific, findable signature, and you can look for it directly.

Start in your tax tool. Pull up every disposal it thinks you made and sort by cost basis. Any sale showing a $0 or suspiciously low basis is a candidate — especially if it's a coin you know you bought for real money. Then trace that coin backward: does its history show a "receive" or "deposit" with no matching "send" from another account you own? That orphaned deposit is the seam. It's the moment the tool lost the coin's past and started its basis over at zero.

Next, confirm the two halves are really the same transfer. Match the amount, the date and time, and the asset between the withdrawal on one side and the deposit on the other. If they line up, they're one internal move that should net to zero — and most tools let you mark them as a transfer or merge the wallets so the basis flows through. What you should not do is accept the $0 and pay tax on it; a blank basis is a prompt to supply your real number, not a verdict that your number was zero. The IRS instruction behind that distinction is spelled out in our 1099-DA cost basis guide.

Doing this by hand across several wallets and years is tedious, and the on-chain half of it is exactly the part a machine should do. Run my free scan to see which of your Ethereum transfers a tax tool would read as a zero-basis disposal — read-only, no sign-up, with a tx-hash on every line so you can verify each one yourself.

The point is not that your software is malicious. It's that the software is reconstructing your history from fragments, and a self-transfer is precisely where the fragments come apart. Once you know that, the wrong number stops being mysterious and becomes a checklist: find the orphaned deposits, reunite them with their sends, and let the real basis flow through to the sale.

FAQ

Do I owe tax when I move crypto between my own wallets?

Generally, no. Moving crypto between wallets, addresses, or accounts that you own and control is not a sale or exchange, so it is not by itself a taxable event — you still hold the same property. What creates a taxable event is a sale or an exchange for something else, not relocating your own coins. Some edge cases (network fees paid in the asset, bridges that mint a different token, accounts that aren't cleanly yours) can carry wrinkles worth a professional's review, but a plain transfer between your own wallets is not a disposition.

Why does my tax software show a gain after I just transferred coins?

Because it couldn't match the withdrawal from one account to the deposit into the other, so it treated them as two unrelated events: a sale of the coins that left, and a fresh acquisition of the coins that arrived with no known cost basis. When it later sells that basis-less position, the whole proceeds look like profit. The fix is to link the two halves so the software recognizes one internal transfer, which lets your original cost basis carry through untouched.

Does moving crypto reset my cost basis or holding period?

No. Cost basis and the acquisition date attach to the coins themselves, not to the wallet holding them. When you move the coins, their basis and holding period move with them, no matter how many wallets they pass through. If a report shows a reset basis or a suddenly short-term holding period after a transfer, that reflects a gap in the software's records of the move, not a change in the underlying tax treatment.

How do I find which transfers broke my cost basis?

Look for disposals in your tax tool with a $0 or unexpectedly low basis, then trace each one back to a deposit that has no matching withdrawal from another account you own. That orphaned deposit is where the software started the coin's basis over. Confirm by matching the amount, date, and asset across the two sides. A read-only on-chain scan can surface these transfers automatically so you can check each one by its transaction hash before filing.


This is not tax advice, and none of the above substitutes for a qualified tax professional who can look at your actual records.

If you'd rather find the broken links before your tax software or your 1099-DA does, Verilot Check reads your Ethereum wallets directly on-chain and shows every transfer between your own addresses that would otherwise be booked as a disposal, with a tx-hash on every line. Free and read-only — no wallet connection, no sign-up, up to 5 wallets and 500 events per scan, Ethereum mainnet today. Run my free scan.