ChainledgHow it works
Calculator

How crypto capital gains are calculated

Chainledg matches wallet movements and supplied exchange records first-in-first-out, using their euro values or historical market quotes. This is the method, including where it stops.

Which wallets and platforms are supported?

Personal 0x wallets on Ethereum, Base, Optimism, Arbitrum, Polygon, Gnosis, Unichain and Celo. Wallets such as MetaMask, Rabby or Ledger work through their public addresses; choose every supported network you used.

Bitcoin and Solana wallet scanning is not supported. Exchange trades in those assets can be included through CSV. Coinbase EUR transaction history, Binance Spot Trade History and a standard EUR template are supported; exchange accounts are not connected directly.

NFTs, staking or lending income and complex DeFi positions need separate records. Cross-network bridges are not matched automatically; review their outgoing and incoming transfers before using the result.

How do I import exchange history?

Open Add exchange history below the wallet field. Use up to four CSV files, 2 MB and 10 000 transactions in total. Include purchases from earlier years, not just the tax year. You can calculate from CSV alone, or add your own wallet addresses. Overlapping exports of the same source are deduplicated; identical fills within one file remain separate.

Coinbase: export transaction history in EUR with Timestamp, Transaction Type, Asset, Quantity Transacted, Spot Price Currency (or Price Currency) and Total (inclusive of fees and/or spread). Buys, sells, sends and receives are supported. Other report layouts, converts, rewards and non-EUR exports stop the import instead of being skipped.

Binance: use Spot Trade History with Date(UTC), Pair, Side, Executed, Amount and Fee. EUR, ETH, BTC, USDC and USDT quote legs are supported. Crypto quote legs use historical EUR quotes. BNB fees, account statements, derivatives and income are not automatically valued; convert these records to verified EUR template rows where applicable. Add deposit and withdrawal records separately.

The EUR template uses Timestamp, Type, Asset, Quantity, Total EUR, Transaction Hash and Fee EUR. Types are buy, sell, deposit, withdrawal and fee. Use positive quantities and decimal points; timestamps are UTC unless an offset is supplied. A buy's Total EUR includes fiat purchase fees; a sale uses net proceeds with its selling fee in Fee EUR. Selling expenses are deducted only with actual cost, never in addition to Finnish deemed cost. For a crypto-to-crypto trade, supply a sell and a buy with the same timestamp and euro consideration. A separate fee row records a crypto fee disposal; include its trading expense in the related buy total or selling Fee EUR once.

Deposits and withdrawals must match another supplied wallet or CSV movement in the same asset and quantity within 24 hours. Enter the net transferred quantity and a separate fee row if the withdrawal fee reduced it. Matching hashes verify a transfer; amount/time matches require your confirmation. Unmatched and ambiguous imported transfers stop the calculation. For tokens, verify the displayed contract before confirming identity, or use TICKER|0xcontract in the EUR template. Confirmation groups that token's FIFO lots with the imported asset.

CSV parsing happens in your browser. Only normalized transaction fields go to the calculation endpoint; the files themselves, account details and free-text notes are not uploaded. Results remain in this tab's session storage. Keep the original statements and exported calculation together for your records.

What counts as a disposal?

Selling or swapping one coin for another is a disposal, and so is spending crypto on goods or paying someone in it. The gain is the euro value received minus the euro cost of the coins that left.

Network fees are a disposal too. Gas paid in ETH means ETH left the wallet at that moment's price, which is why the fee shows up in the register rather than being netted away silently.

Moving coins between your own wallets is not a disposal. The chain cannot tell your second wallet from a stranger's, so enter every address you own in the same run and the transfers between them cancel out.

How does FIFO matching work?

Acquisitions form a queue per asset, oldest first. A disposal consumes from the front of that queue until it is filled, and each consumed lot carries its own euro cost into the result.

The queue is global per asset, not per chain. ETH bought on mainnet and sold on Arbitrum draws from the same line, because it is the same asset for tax purposes.

Where do the euro prices come from?

Coinbase Exchange's public quotes, taken at the hour each transaction was mined. They are a market rate, not an official one, and no key or account is involved.

Settled windows are cached, so the same wallet and the same tax year return the same figure to the cent every time. A calculation that moves between runs is not one you can attach to anything.

Why are counterfeit tokens excluded?

Wallets get flooded with tokens whose ticker imitates a real one, written with accented letters, characters borrowed from other alphabets, or invisible padding between them. Others carry a website in the name as airdrop bait.

A calculator that trusts the ticker books disposals that never happened, at prices belonging to a different asset. These transfers are identified and left out, and every one of them is listed so you can check the decision rather than take it on faith.

What can a wallet address not tell you?

The price you paid on an exchange. Coins bought on Coinbase or Binance and withdrawn to a wallet arrive with no acquisition cost attached, because the purchase happened off-chain.

An incoming transfer can be valued at the price on arrival, but that is an estimate of the original cost and acquisition date. Disposal lots using that estimate are marked in the register and flagged in Checks. The real gain or loss may be higher or lower.

When no acquisition lot exists at all, the register marks it as missing. Use the exchange's purchase records or add your other wallets; a wallet balance that matches the chain does not verify your cost basis.

What changes if I pick Finland instead of generic FIFO?

Generic FIFO calculates gains and losses without country-specific relief. It is a calculation method, not a supported tax regime for every country.

Finland compares each lot's cost with the deemed acquisition cost under ITA 46.1: 20 percent of proceeds, or 40 percent after ten calendar years. The higher deduction is used. Loss carry-forward is explained, but earlier losses and other capital income are not included in this calculation.

Under Finnish rules the tax year follows Finnish time, so a sale at 00:30 on 1 January belongs to the new year. Generic FIFO counts the year in UTC.

The €1 000 exemption depends on all eligible asset sales during the year, including shares and transactions outside these wallets. It is not automatically applied here. A loss may still be deductible when total acquisition costs exceed €1 000, so gains and losses have different tests.

Current Finnish guidance treats qualifying fiat-backed stablecoins as currency. This report applies crypto FIFO and flags USDC/USDT transactions for separate currency-tax review; it does not determine whether the coin meets the official criteria or calculate the currency-specific tax treatment.

Can I calculate the current year or an older year?

Choose any year from 2015 onwards. The calculation reads earlier acquisitions too, because their cost is needed for FIFO; it reports disposals for the selected year.

The current year is a year-to-date snapshot. Its result and holdings stop at the calculation date, and its reports are marked accordingly. Run it again after the year ends for the annual statement.

Is this tax advice?

No. It is a calculation from public data, and the working is shown so an accountant or a tax authority can follow it line by line.

The balance reconciliation is part of that: the closing balance implied by the entries is compared against the chain's own balance, and a mismatch is reported rather than hidden. Where the two disagree, the register is incomplete and the number should not be filed as it stands.

Finnish rules: Tax Administration guidance · Small-disposal rules

Export instructions: Coinbase statements · Binance spot history

Run it on a wallet