Calculation applies rules. Reconciliation earns the right to.

Tax rules are mechanical: same-day, the 30-day rule, the Section 104 pool. Any competent tool applies them. The answer is decided earlier — by what each on-chain event is taken to be. An importer decides that by convention. We decide it by cross-referencing every source available, and where evidence can’t settle it, by asking you — with both outcomes costed.

Every check below fired on a real dataset: 7 wallets, 5 venues, 4 chains, ~30,000 records, three tax years of pooling. The counts are what they caught.

The pipeline

Ingest
Raw feeds per venue, retained. Never parsed-only.
Normalise
One event schema, provenance kept per field.
Identity
Canonical asset, your wallet cluster, counterparty class.
Reconcile
The check catalogue — the differentiated layer.
Match
HMRC rules, three engines — pooled assets never mix with specifically-identified NFTs.
Report
Working paper, evidence workbook, open questions.

Why a wrong answer is silent

The failure mode is not an error message. It is a plausible number that is too high, because missing cost basis always overstates gains. A disposal with no matched acquisition does not fail — it reports 100% of proceeds as profit.

On the reference dataset, orphaned proceeds started at £481,463 and finished at £102,792.73 across the 17 disposals still carrying none, after five distinct fixes. That is a reduction, not a resolution — it names what still has no cost basis rather than absorbing it.

HMRC does not apply one method to everything

There are three matching engines, and running the wrong population through the wrong one is wrong twice over.

EnginePopulationBasis
Pooled — on-chainFungible tokens across chains and venues — including tokenised equities, tokenised stocks, tokenised treasuries and other real-world assets (RWAs)Section 104: same-day, then 30-day, then pool
Pooled — venue spotFungibles bought on a venue and bridged outThe same pool as the on-chain holding
Specific identificationNon-fungiblesNo pooling and no matching rules (CRYPTO22200)

Real-world assets are read the same way as any other token. A tokenised equity, a tokenised stock, a tokenised treasury bill or a gold-backed token is an ERC-20 transfer on the same chains, so the same engine reads it, prices it by contract, pools it under Section 104 and matches its disposals to the acquisitions that paid for them. There is no separate RWA mode and no allowlist of supported tokens: an asset the engine has never seen before is reconciled by its contract address like everything else, and one it cannot price is reported as unpriced rather than carried at nil.

What the reconciliation does not do is decide what an asset is for tax. A token that represents a share may be a security rather than a cryptoasset, and a distribution paid on one may be income rather than a capital receipt — questions of fact that change the answer and that only you and your adviser can settle. The engine never assumes: receipts it cannot classify are put to you as open questions with the amount at stake stated, the same as any other judgement call.

Running a non-fungible through the pooling engine pools what must never be pooled and applies rules HMRC excludes. The engines are separate, and the pooled ones actively guard against non-fungibles arriving rather than relying on none turning up. Verified against HMRC’s published worked examples at CRYPTO22251 for pooling, CRYPTO22252 for the same-day rule, and the interaction cases at CRYPTO22255–22257.

The check catalogue — 46 checks live, by family

Cost-basis integrity

Unpriced swaps, prior-year pooling depth, orphaned disposals, unbounded lookback. Recovered £497,000 of prior-year basis; orphans £481,463 £102,792.73.

Cross-venue identity

Bridged, wrapped and cross-chain assets resolved to one pool, every pairing carrying cited evidence. Solana orphans fell £190,470 £23,959 on one pairing.

Double-count detection

Own-wallet transfers, chained swaps, router legs, duplicate rows. ≈ £1,750,000 of double-counted swap value avoided.

Authenticity

Homoglyphs, typosquats, impostor mints — identity by contract address, never symbol. ≈ £10,200,000 of fabricated valuations quarantined, including a ≈ £4,260,000 fake.

Source integrity

Raw feed vs parsed feed, silent truncation, pagination loss, venues invisible to explorers. 172 missing swaps reconstructed from raw transfers.

Time, currency, fees

Tax-year boundaries in local time, per-transaction FX from a citable source, fees attributed once and only where you paid them.

What we refuse to do

What we refuse to decide

Whether an address is yours. Whether a receipt was earned. How your derivatives are classified. These are questions of fact — the engine states each one and costs both outcomes — but you have to confirm which one. On the reference dataset that meant 4,190 decisions settled from evidence and 16 put to the user. A tool that queues 4,000 items isn’t being thorough; it is declining to do its job.

Every figure declares its confidence

  • Resolved by evidence The engine determined this from evidence and can show its working.
  • Open — yours to answer A genuine judgement call. The financial impact of each outcome is stated before you choose.
  • Estimated or capped Carried at an estimate or a cap. The basis is stated on the face of the output.

Written for the 2025-26 tax year, which moved cryptoassets to SA108 boxes 13.1–13.5. Last reviewed against the current form on 16 August 2026.