When crypto tax software assigns a cost basis to a DEX swap, it typically skips the swap itself and looks up the token's daily price in an aggregated index, then multiplies. For a liquid token bought on a large centralized venue, that shortcut lands close enough that nobody questions it. For on-chain swaps it produces a figure that no one, at any point, actually traded at. Starting with 2026 transactions, the IRS begins receiving cost basis data on Form 1099-DA, which turns the quality of that figure from a rounding preference into a compliance question.
The mechanics of the shortcut are documented by the tax platforms themselves, and they're worth reading closely.
How tax software prices a DEX swap today#
CoinTracking's support documentation states that its coin prices are averages drawn from CoinMarketCap, CoinGecko and WorldCoinIndex, weighted by trading volume across exchanges, and that prices from decentralized exchanges are not included in the calculation. Coinpanda's help pages state that the majority of its market rates come from CoinGecko, and that when CoinGecko has no price for a particular day, the user has to enter the value manually.
Read those two statements together and the shape of the problem appears. The price assigned to your on-chain swap is a volume-weighted average of centralized venue trades, computed by an index that excludes the venue class where your trade actually happened. And when the index has no data at all, which is common for thin or newly launched tokens, the fallback is a number you type in yourself.
To be fair to the aggregators, this design is reasonable for what it covers. CoinGecko tracks far more chains and far more DEXs than any single data provider, SiftingIO included, and a daily index value is a sensible default for mainstream tokens. The gap is about what the number can prove, and about which trades it silently misprices.
An average is not a fill#
A daily index price is a statistic. Your swap is an event. On a deep pair the two usually sit close together. On a thin token they can be far apart, and the divergence is mechanical rather than random.
Swap a large amount against a small pool and the pool's pricing curve moves against you as the trade executes. The effective rate you received, tokens out divided by tokens in, already includes that slippage. The daily average does not, because it was computed from other people's trades on other venues at other times. The bigger your trade relative to the pool, the further your real rate sits from the day's statistic. Slippage is part of your price, and an index-based basis erases it.
You can see the exposure by checking pool depth:
curl -H "X-API-Key: $SIFTING_KEY" \
"https://api.sifting.io/v1/last/tvl/eth/WETH-USDC"
A shallow pool moves on trades that a deep pool absorbs invisibly. The same depth figure tells you, after the fact, how plausible it is that your fill matched a global daily average. For WETH-USDC on Ethereum, plausible. For a small token in a lightly funded pool, often not.
Form 1099-DA makes cost basis your problem#
The stakes changed with the broker reporting rules. Cost basis reporting on Form 1099-DA begins with 2026 transactions, and the first forms carrying basis arrive in early 2027. The coverage boundaries matter more than the start date. Assets acquired before 1 January 2026 are noncovered. Assets transferred into a broker from an outside or unhosted wallet are noncovered, and brokers are not permitted to report basis for them. Decentralized exchanges and unhosted wallet providers sit outside the regulations entirely.
Follow that boundary to its conclusion: for on-chain activity, no broker will ever send you, or the IRS, a basis number. The only source is your own records and the software that assembles them. When that software's method is a daily average from an index that excludes DEX trades, the number that ends up in your filing is an estimate presented as a fact.
The swap record is the primary source#
A better source already exists, and it's public. A DEX swap is a single event on a specific block, with a transaction hash and exact amounts in and out. The trader's real rate is arithmetic on two numbers the chain recorded permanently. Under audit, that difference matters: a transaction hash resolves to an immutable record anyone can verify, while a daily index value resolves to a methodology page.
SiftingIO indexes DEX swaps on Ethereum, Base, Arbitrum, BNB Chain and Polygon, normalized into one schema, so swap-level data can be pulled without running an archive node per chain. Live swaps stream over WebSocket: connect to wss://stream.sifting.io/ws/v1?key=$SIFTING_KEY, then send
{ "op": "subscribe", "product": "dex", "symbols": ["eth:WETH-USDC"] }
Each tick frame carries the chain and pair alongside price and an epoch-millisecond timestamp, and the wallet endpoint at /v1/fnd/dex/wallet/{chain}/{address} returns a wallet's current holdings across native and ERC-20 balances. See /docs for the full DEX surface.
One thing bears repeating: this coverage is narrower than the aggregators'. CoinGecko prices more chains and more DEXs than SiftingIO does, and if the token you traded lives outside the chains listed above, an index price may be your only option. The argument here is narrower and stronger. Where a swap-level record exists, it beats an average, because it is the actual transaction at the actual rate, tied to a hash a reviewer can check.
Common pitfalls#
Three failure modes show up repeatedly in on-chain tax records.
Manual entries with nothing behind them. Coinpanda's documented fallback, typing a value when CoinGecko lacks a price for the day, is exactly where thin tokens land. If you must enter a value manually, derive it from the swap itself (the USD leg divided by the token leg) and file the transaction hash next to it, so the figure has a source other than memory.
Multi-hop routes netted wrong. Routers frequently split a swap across several pools, producing multiple pool-level events under one transaction hash. Your rate is the net of the whole route: total out divided by total in. Pricing each hop separately from a daily index, which is what index-based software effectively does, compounds the drift once per leg.
Waiting for a 1099-DA that can't arrive. The first basis-bearing forms in early 2027 cover 2026 transactions at covered brokers only. Lots acquired before 2026, lots transferred in from self-custody, and everything executed on a DEX will show up with no broker-reported basis. If your reconciliation plan assumes the form will settle discrepancies, the on-chain portion of the ledger will still be open when the form arrives.
The working rule for on-chain activity: the chain is the record of first resort, and the index is the fallback. Most tax software has it the other way around.



