Deep dive: Tracking cost basis in Splits

Deep dive: Tracking cost basis in Splits

6 min read

Why we built cost basis tracking

Onchain accounting has all the problems of regular business accounting, plus the tax headaches of day trading: onchain businesses book profits in volatile tokens, manage DeFi positions as part of their day-to-day operations, and are sometimes paid in hundreds of thousands of microtransactions.

A big reason it's so painful? Cost basis. Cost basis is what you paid for a token when you acquired it, and it's the number every gain or loss calculation and every tax estimate starts from. A business that receives ETH on Monday, USDC on Tuesday, and yield every block has thousands of acquisition prices to track, and every outgoing transfer has to be matched back to one of them.

We already index every transfer that touches your accounts, log historical pricing, and capture your business context with nested wallets, memos, and metadata. Why not push accounting further with cost basis tracking?

What this post covers

This post explains how cost basis tracking in Splits works in detail so you can decide whether to trust it. We heard four recurring questions from our design partners as we began planning the work:

  1. Will this be a complete record of all related transactions?
  2. Do these transactions reconcile with the end balances?
  3. Is there an audit trail?
  4. Does it follow IRS guidance?

The work was structured to answer these four questions.

Important note: The tax treatment in this post was reviewed and signed off by Darien Advisors. If you run a crypto company that needs someone to close its books, book a call with them.

How it works

When a token enters or exits your Splits account, we record which token, how much, which direction, and when. We price each transfer in dollars at the time it happened, using our indexer and pricing engine, with Alchemy and CoinGecko as fallbacks.

Next, Splits turns that ledger into tax lots, tracked separately per wallet, per chain, and per token. A lot is one batch of tokens acquired at one price on one date.

A token entering your wallet opens a new lot: quantity, acquisition date, and cost basis from the dollar value at the time. A token exiting your wallet (via transfer to an external wallet or swap) draws down lots.

Splits draws down from the oldest lots first by default (FIFO). Each disposal records proceeds, basis, gain or loss, and holding period.

Tokens transferred between your own wallets are internal transactions: the lot moves to the new wallet with its basis and acquisition date intact, and no taxable event is triggered.

The reports

Lots and disposals feed a set of reports for closing books, drafting tax estimates, or getting a picture of your company's finances.

Statement: A monthly account statement modeled on what a bank sends: starting and ending value, net flow, price change, and realized gains on the cover page, with token balances, transactions, and gains and losses for the month. 

This is a report you can hand to anyone who needs to verify business activity and holdings during and at the end of a specific period.  Often, lenders and other third parties will go to the source data to confirm the actual cash flows for the business.

Transaction history: Every transfer in the selected period is listed as a row, including internal transfers, with counterparty labels, memos, transaction hashes, and cost basis on any row that disposed of a lot. 

This is the report you use like a bank export: reconcile against the books and look anything up by hash.

Realized gains and losses: One row per disposed lot, with lot ID, proceeds, cost basis, gain or loss, and holding period.

This is the report you use for trading taxes and for checking the gain on any single trade.

Lots: Every lot, open and closed, tracked per wallet address and chain.

This is the report you use to see which lots in which wallets are underwater before year end.

Is this a complete record of all my transactions?

Yes, Splits runs its own indexer against all Splits workspace accounts. We cross-reference against other indexing providers like Alchemy, so every transfer in or out of your accounts is caught. This includes inbound transfers, a category that consumer wallets routinely miss.

Two cases have no transfer to index, and we handle both explicitly:

  • Rebasing tokens like stETH and other vault tokens grow in balance every block with no event. Rather than book a line per block, Splits observes the balance at period boundaries, calculates the growth, and books an accrual lot for the difference monthly. If you dispose mid-period, the accrual is caught up to the point of sale first, so nothing goes unbooked.
  • Bridges are tracked end to end. A same-token bridge carries the original basis to the new chain. A bridge that changes tokens is a disposal.

Do these transactions reconcile with end balances?

Yes, the sum of your open lots always equals your onchain balance, for every token in every account. The system checks this on every rebuild.

If a disposal ever exceeds what the lots can cover, the engine flags a zero-basis shortfall lot instead of dropping quantity. Zero basis means the whole amount is treated as gain, which is the conservative treatment.

Is there an audit trail?

Yes, producing reports that are auditable both onchain and within Splits was a goal for this initiative.

Auditing onchain data

Every lot comes from a transfer with a hash. Every disposal points to the specific lots it drew from. Every row on every report can be verified onchain via block explorers.

Lot IDs are stable. Books are rebuilt from the underlying transfers rather than edited in place, and a rebuild on the same facts produces the same lots with the same IDs.

A transfer with no reliable price, or a bridge whose funding leg hasn't been resolved, produces a lot with a warning that follows it onto the report.

Auditing corrections

You can modify the cost basis and holding periods in Splits.

You (or your accountant) can manually fix the price or acquisition date on a lot, or seed a lot representing an off-chain purchase and attach it to the transfer it fed. Token quantity is never editable.

Modifications are append-only tables called “assertions,” a record of changes associated with the lot and the person who made them. The most recent assertion wins, and the entire history stays visible.

Does it follow IRS guidance?

Yes, we worked with three separate tax professionals to ensure our system matched IRS guidance as of Q2 2026. We sweated the technical details: 

  • Holding periods use calendar math per IRS guidance, so a disposal on the one-year anniversary is correctly short-term and leap years don't misclassify anything. The gain on each lot is reported separately.
  • Lots are tracked per wallet, per chain, per token.
  • Moving a token between your own accounts, or bridging it to another chain, is not a taxable event. The original basis and acquisition date travel with the lot, and the new lot points back to the one it came from.
  • We’ve built the engine to be extendable. FIFO today; HIFO, LIFO, and specific identification are on the roadmap.
  • DeFi positions follow the same model. Vault shares and wrappers like wstETH are a single lot with their own price; yield is realized as gain when you exit.
  • Balance-accruing tokens get periodic accrual lots as described above.

What's next

The Splits Accounting engine is live today covering over three million indexed transfers across ten chains.

What it doesn’t do yet: categorize transactions for a P&L or sync with accounting software like Xero and QuickBooks. Both are coming in October.

If you have questions or requests about what we build next, we want to hear them! Reach out on email support@splits.org or @0xSplits on Twitter.

Subscribe for updates