Crypto tax software and portfolio tracker testing
FintechAssuranceLabs tests crypto tax software and portfolio trackers, products like Koinly, CoinTracker, and Delta, where a calculation defect reaches a user's tax return. The test scope covers exchange and wallet imports, transfer matching, cost basis and lot relief per wallet, staking and airdrop income, and reconciliation with Form 1099-DA, DAC8, and CARF data.
What breaks in crypto tax calculations and what it costs
Users pay a subscription for one output they file: a report of gains, losses, and crypto income. A calculation defect goes onto the tax return, so the user pays it as extra tax or a penalty, and the vendor pays it back as refunds and lost renewals.
- Transfer between own wallets imported as a sale. An exchange withdrawal and the matching wallet deposit arrive from two imports, and the deposit is smaller by the network fee. The matcher misses the pair, records a disposal and a new lot at the transfer date, and restarts the holding period. The user sees a gain that never happened, and on plans tiered by transaction count, the extra rows push the account into a higher tier. The 2026 Instructions for Form 1099-DA let a broker without customer-provided acquisition information treat transferred-in units as acquired at the transfer date for lot selection, and such units are noncovered, so the original acquisition date often exists only in the tracker.
- One lot pool across every wallet after 1 January 2025. The engine keeps a universal pool and relieves the highest-cost lot held in a cold wallet against a sale on an exchange. 26 CFR 1.1012-1(j) applies lot identification per wallet or broker account to acquisitions and dispositions on or after 1 January 2025, with first-in first-out inside the wallet when no identification is made. The report understates the gain, and IRC section 6662 adds 20% of the underpayment attributable to negligence or a substantial understatement.
- Swap fee deducted twice. On a crypto-to-crypto swap, the engine subtracts the fee from the proceeds of the token sold and also adds it to the basis of the token received. Paragraph (h)(2)(ii)(B) of 26 CFR 1.1012-1 allocates that fee exclusively to the disposition. Every swap understates gains by the fee, so the error grows with the swap count of high-volume traders, and for covered units sold in 2026, box 1g of Form 1099-DA shows the IRS a different basis.
- Staking reward priced at the wrong moment. Rewards arrive with UTC timestamps, and the engine prices each one at a local-time daily close, or stores an unpriced reward with zero basis. Rev. Rul. 2023-14 includes a cash-method taxpayer's staking rewards in income at fair market value as of the date and time the taxpayer gains dominion and control. Section 3.03 of Rev. Proc. 2024-28 generally ties the basis of units received as income to the amount included in income, so a zero basis taxes the same value again at sale.
- Canadian profile on a US lot method. The lot method defaults to first-in first-out for every country. Section 47(1) of the Income Tax Act averages the adjusted cost base of identical properties. Paragraph 40(2)(g)(i) sets a loss to nil when it is a superficial loss under section 54: the taxpayer or an affiliated person acquires identical property within 30 days before or after the disposition and still owns it at the end of that period. The user then owes tax on the gains the reported loss offset.
Licence flag and the evidence buyers and tax rules require
Crypto tax and portfolio trackers carry licence flag "no": they read exchange and wallet data and produce reports without holding client assets or moving money. Their calculations still have to reconcile with the information returns exchanges file on the same users. Sources in this section were checked on 2026-09-16.
Evidence enterprise buyers ask for
Accounting firms and exchange partners ask for a current SOC 2 report (SOC 2 testing requirements), a security questionnaire, a penetration test report with retest results, and how read-only API keys and other account data are stored. EU deployments add a data processing agreement under GDPR. Evidence we produce: API key scope tests that reject keys with withdrawal permission, isolation tests between accountant and client workspaces, and a recalculation pack for every tax form output.
US: Form 1099-DA and per-wallet basis
Brokers report gross proceeds on digital asset sales from 1 January 2025 and basis on certain sales from 1 January 2026 (IRS broker regulations page, updated 7 November 2025). A covered security is a digital asset acquired after 2025 in a custodial account and held there until the sale. Rev. Proc. 2024-28 gives a safe harbor to allocate unused basis to each wallet or account as of 1 January 2025, and section 4.02(6) requires the taxpayer to treat that allocation as irrevocable. Notice 2026-20 lets taxpayers record lot identification for broker-held units on their own books through 31 December 2026 and states that broker-reported basis for 2026 transactions may not match those books. Evidence we produce: a per-sale reconciliation of Form 8949 lines to 1099-DA rows with each difference classified.
EU: DAC8 from 1 January 2026
Council Directive (EU) 2023/2226 applies from 1 January 2026. Under Article 8ad(3), reporting crypto-asset service providers report per user and per crypto-asset type the aggregate amounts paid and received against fiat, the fair market value of crypto-to-crypto exchanges, and transfers, valued in a single fiat currency at the time of each transaction. Authorities exchange the 2026 data within nine months after year end (Article 8ad(6)). Evidence we produce: per-asset annual totals in the DAC8 categories from the tracker's ledger, with price source differences listed.
Canada: CARF and identical property rules
The OECD list of CARF commitments, updated 14 September 2026, places Canada among 27 jurisdictions committed to first exchanges by 2028 and the United States among 4 by 2029. Budget 2025 lists the Crypto-Asset Reporting Framework with a deferred application date of 1 January 2027. The CRA says users should keep each wallet address and the beginning and ending balance and cost of each crypto-asset per year. Evidence we produce: adjusted cost base averaging results, superficial loss window tests, and year-end wallet balances in Canadian dollars.
Crypto tax and cost basis test scenarios
- Import one exchange by API and by CSV with overlapping dates, and confirm each trade counts once in the ledger and in the plan limit.
- Match self-transfers where the deposit is smaller by a network fee or arrives hours later, and confirm the holding period carries over.
- Sell from an exchange account holding bought and transferred-in units, with and without a standing order, and compare lot selection with the 26 CFR 1.1012-1(j) default.
- Lock a Rev. Proc. 2024-28 allocation, import older wallet history afterwards, and confirm the 1 January 2025 basis per wallet does not change.
- Reconcile an imported 1099-DA file per sale on proceeds, box 1g basis, and the covered flag, including a broker that left basis blank.
- Run swaps where the exchange withholds received units for the fee, against paragraphs (h)(2)(ii)(C) and (j)(3)(iii) of 26 CFR 1.1012-1.
- Credit staking rewards and airdrops at 23:30 on 31 December local time, and check tax year, price timestamp, and carried basis, with balance checks from the ledger reconciliation testing guide.
- Recalculate adjusted cost base for a Canadian profile with CAD and USD purchases, then sell at a loss and rebuy on day 30 and day 31 in another wallet.
- Downgrade a subscription mid-season and check imports at the plan limit boundary under subscription billing testing.
Integrations and protocols to cover
- Exchange APIs. REST endpoints signed with HMAC read-only keys, OAuth connections, and pagination and rate limits on multi-year trade history.
- File imports. Exchange CSV schemas that change between versions, mixed time zones, and Form 1099-DA files.
- Blockchain data. Ethereum JSON-RPC and explorer APIs for token and internal transfers, Bitcoin extended public keys with BIP32 address derivation, and staking reward events, covered with crypto exchange and wallet testing.
- Price and FX data. Historical token prices by minute and day, and USD, EUR, and CAD conversion rates.
- Tax outputs. Form 8949 exports, import files for tax filing software, and Canadian Schedule 3 data, checked by financial calculation testing against an independent reference model.
Related
Services
Sample deliverable
Sample, synthetic data
| ID | Source pair and instrument or asset | Internal quantity or amount | External quantity or amount | Difference (internal minus external) | Break classification and cause |
|---|---|---|---|---|---|
| POS-01 | Internal position ledger vs custodian settled position file: Equity A shares | 1,200 shares | 1,000 shares | +200 shares | Timing break, expected: a 200-share buy executed on trade date settles on T+1 and is absent from the settled position file until the next file |
| POS-02 | Internal position ledger vs clearing position file: Equity B shares | 500 shares | 1,000 shares | -500 shares | Corporate action break, open: the clearing file applies a 2-for-1 split on the effective date and the internal ledger has no split entry |
| POS-03 | Portfolio ledger vs custodian holdings file: Fund A units | 1,250.457362 units | 1,250.457 units | +0.000362 units | Rounding break inside the 0.001-unit tolerance: the portfolio ledger stores units to 6 decimal places and the custodian file to 3 |
| POS-04 | Hot wallet ledger vs blockchain node balance: Testnet coin A on a public testnet | 2.500000 coin A | 2.000000 coin A | +0.500000 coin A | True break, defect: deposit DEP-7713 was credited after 1 confirmation against a configured threshold of 12, and a chain reorganisation removed the transaction from the canonical chain |
| POS-05 | Hot wallet ledger vs blockchain node balance: Testnet coin A on a public testnet | 50.000000 coin A | 49.999580 coin A | +0.000420 coin A | True break, defect: the network fee for withdrawal WD-2291 was paid from the hot wallet and has no ledger entry |
| POS-06 | Tracker holdings from imported exchange history vs self-custody wallet node balance: Testnet coin B | 1.0000 coin B | 0.9995 coin B | +0.0005 coin B | True break, defect: the import records the exchange withdrawal at the gross amount and drops the 0.0005 coin B withdrawal fee, so the lot quantity is overstated by 0.0005 coin B and later disposals consume units the wallet does not hold |
| POS-07 | EWA advance ledger vs employer payroll deduction file: employee EMP-0042, pay period PP-18 | 350.00 XTS | 300.00 XTS | +50.00 XTS | Timing break, expected: advance ADV-5520 was requested after the payroll cut-off and the employer file deducts it in pay period PP-19 |
| POS-08 | Revenue-share remittance ledger vs expected remittance recalculated from processor revenue feed: agreement RBF-0310, month M-06 | 1,200.00 XTS | 1,160.00 XTS | +40.00 XTS | Calculation break, defect: the remittance applies the 8% share to 15,000.00 XTS gross revenue, while the agreement defines the share on 14,500.00 XTS revenue net of refunds |
Amounts use XTS, the ISO 4217 code reserved for testing; Equity A, Equity B, Fund A, and testnet coins A and B are generic test instruments with no market value, and all employee, agreement, deposit, and withdrawal IDs are invented.
Questions
What is cost basis for crypto?
How to calculate crypto cost basis?
What is the cost basis for airdrops?
Scope testing for your tax engine
Send your supported exchanges, wallet types, lot methods, and tax jurisdictions, and we return a test scope with reference calculations for each report you generate.
Scope your testing