Denmark Crypto Cross Trades (SKAT Tax Rules for Crypto-to-Crypto)

When you trade one cryptocurrency for another, SKAT treats it as a disposal of both assets. Here is exactly how to calculate and report cross trades.

In Denmark, exchanging one cryptocurrency for another — known as a cross trade — is a fully taxable event under SKAT rules. Unlike jurisdictions that offer like-kind exchange deferrals, Denmark requires you to calculate gains or losses on both legs of the trade as if you sold the outgoing crypto for Danish kroner (DKK) and immediately bought the incoming crypto with the proceeds. This means every swap on a centralised exchange, every liquidity pool interaction, and every decentralised exchange trade triggers a tax calculation. The legal foundation rests on SKAT's binding answer SKM2014.805.SR, which established that crypto disposals are speculative income (personlig indkomst), and subsequent rulings have confirmed this applies equally to crypto-for-crypto exchanges. The FIFO principle applies to each cryptocurrency separately, so you must track your cost basis per asset. This guide covers the priority list valuation method, calculation examples with full math, reporting requirements, documentation best practices, and common pitfalls. Read the main Denmark crypto tax guide →

What Is a Crypto Cross Trade?

A crypto cross trade is any transaction where you exchange one cryptocurrency directly for another without involving fiat currency. This includes swapping Bitcoin (BTC) for Ethereum (ETH) on a centralised exchange like Kraken or Binance, trading ETH for Solana (SOL) on a decentralised exchange like Uniswap or Jupiter, providing liquidity to a pool where your deposited tokens are converted to a different token, and using one cryptocurrency to purchase another in any manner. In each case, SKAT treats the transaction as two simultaneous events: a disposal of the cryptocurrency you are giving up and an acquisition of the cryptocurrency you are receiving. Both legs are taxable events for Danish tax purposes.

The critical distinction is that a cross trade is not a continuation of the same investment. Even if you trade one volatile asset for another, you have realised any gain or loss embedded in the outgoing cryptocurrency. This means you cannot defer tax by keeping your wealth in crypto form — every swap resets the tax basis. The only non-taxable crypto movements are internal transfers between wallets you control, provided you can document ownership of both wallets. Any exchange of one cryptocurrency for a different cryptocurrency — whether dissimilar (BTC to ETH) or similar (USDC to DAI) — is a taxable event.

Cross trades are particularly significant for DeFi users. When you deposit ETH into a lending protocol like Aave and receive aETH, that is generally not a taxable event because you retain beneficial ownership. However, if you use ETH to acquire a different asset through a swap, futures position, or options trade, the exchange component is a cross trade. Similarly, when you provide liquidity to a concentrated liquidity pool on Uniswap V3 and your position shifts between tokens due to price movements, each rebalancing event may constitute a taxable swap. SKAT has not yet issued specific guidance on automated portfolio rebalancing in DeFi, but the general principles apply: any time beneficial ownership of one crypto changes to another, a taxable event has occurred.

SKAT Priority List for Valuation

Because a cross trade involves no fiat currency, SKAT requires you to determine the fair market value of both legs using a priority list methodology established through Danish tax practice and confirmed in multiple binding answers. The goal is to arrive at an objective DKK-denominated value for the transaction so that gains and losses can be calculated. The priority list works as follows:

Level 1 — Fiat-Backed Stablecoins (USDT, USDC, DAI): If one leg of the cross trade involves a fiat-backed stablecoin, the transaction is valued using the stablecoin's face value. For example, if you trade 1 BTC for 50,000 USDC, the transaction is valued at 50,000 USDC, converted to DKK at the exchange rate prevailing at the time of the trade (using SKAT's official exchange rate or the Nationalbanken rate). Stablecoins are considered the most reliable valuation source because their value is pegged 1:1 to the US dollar. However, if a stablecoin is trading significantly away from its peg (depegged), you must use the actual market price, not the face value. SKAT has addressed stablecoin depegging in SKM2022.300.SR, confirming that stablecoins that deviate from their peg are valued at their actual market price.

Level 2 — Major Widely-Traded Cryptocurrencies: If neither leg is a stablecoin, you use the most widely-traded cryptocurrency in the pair as the valuation reference. SKAT considers Bitcoin and Ethereum as the primary reference assets. For example, if you trade ETH for SOL on a DEX where both are volatile, you look to the ETH price (or SOL price) on a major reference exchange (such as Kraken, Coinbase, or Binance) at the time of the trade. The value is determined by whichever reference price is most objectively determinable from a liquid market. The specific exchange used as the reference should be a regulated exchange with substantial trading volume. If the trade occurs on-chain, you can use the Time-Weighted Average Price (TWAP) from a reputable oracle like Chainlink for the relevant time window.

Level 3 — Other Cryptocurrencies and Illiquid Assets: For trades involving less-liquid or obscure tokens with no reliable reference price on major exchanges, you must use the best available evidence of fair market value. This could include the last traded price on the exchange where the trade occurred, the price from CoinGecko or CoinMarketCap's volume-weighted average price, or the price from a DEX liquidity pool at the time of the trade. If the token is extremely illiquid, you may need to obtain a valuation from a qualified third party. SKAT expects taxpayers to use reasonable efforts to determine fair market value and may challenge valuations that appear to minimise gains or inflate losses. Documentation of the valuation methodology is essential.

Example — BTC for ETH with full math: Maria holds 1 BTC with a FIFO cost basis of DKK 200,000. She trades this 1 BTC for 15 ETH on a DEX. At the time of the trade, 1 BTC = DKK 450,000 on Kraken, and 1 ETH = DKK 30,000 (so 15 ETH = DKK 450,000). Under the priority list, neither leg is a stablecoin, so we use the BTC price on a major exchange as Level 2. The disposal of 1 BTC has proceeds of DKK 450,000. Maria's gain is DKK 450,000 minus DKK 200,000 = DKK 250,000 gain, reported in box 20. Maria now holds 15 ETH with a cost basis of DKK 450,000 total (DKK 30,000 per ETH). If she later sells 10 ETH at DKK 35,000 each, her gain is (DKK 350,000) minus (10 x DKK 30,000 = DKK 300,000) = DKK 50,000 gain. The FIFO pool for ETH started with the acquisition date of the cross trade.

Calculating Gains on Cross Trades

Every cross trade involves two separate calculations that must be performed independently under Danish tax rules. There is no netting between the two legs — each leg is calculated as its own disposal event. The calculation follows these steps: identify the cryptocurrency being disposed (the asset you are giving up), determine the FIFO cost basis of the disposed units using the oldest holdings of that cryptocurrency in your portfolio, determine the DKK-denominated proceeds of the disposal using the priority list valuation method described above, calculate the gain or loss as proceeds minus cost basis, record the acquisition of the new cryptocurrency with a cost basis equal to the proceeds from the disposal (i.e., the value of the outgoing crypto determines the cost basis of the incoming crypto).

Detailed worked example — cross trade with partial disposal: Anders holds 2.5 ETH with a total FIFO cost basis of DKK 75,000 (DKK 30,000 per ETH). He trades 1.5 ETH for 0.05 BTC. At the time of trade, 1 ETH = DKK 32,000, so 1.5 ETH = DKK 48,000. The BTC received is valued at DKK 48,000 (since this is the value of the ETH given up). Anders's gain on the ETH disposal: proceeds DKK 48,000 minus cost basis (1.5 x DKK 30,000 = DKK 45,000) = DKK 3,000 gain. Anders now holds 1.0 ETH remaining (cost basis DKK 30,000) plus 0.05 BTC with cost basis DKK 48,000 (so DKK 960,000 per BTC effective cost basis).

Cross trade at a loss: If the value of the cryptocurrency you are disposing has fallen since acquisition, the cross trade triggers a deductible loss. For example, Sofie holds 100 SOL with a FIFO cost basis of DKK 25,000 total (DKK 250 per SOL). She trades 50 SOL for 0.8 ETH when 1 SOL = DKK 300. The proceeds on the SOL disposal are 50 x DKK 300 = DKK 15,000. Sofie's cost basis in the 50 SOL is 50 x DKK 250 = DKK 12,500. Her gain is DKK 2,500 (reported in box 20). If instead SOL had fallen to DKK 200 per SOL, her proceeds would be 50 x DKK 200 = DKK 10,000, cost basis remains DKK 12,500, resulting in a loss of DKK 2,500 (reported in box 58). The loss is deductible only at the municipal tax rate (approximately 26%) and cannot offset other forms of income directly — it offsets against other speculative gains first.

Cross trades with fees: Transaction fees (gas fees on Ethereum, Solana, etc. and trading fees on centralised exchanges) are generally treated as part of the cost basis of the acquired asset. For example, if you pay 0.01 ETH in gas to execute a cross trade where you swap 1 BTC for 10 ETH, the 0.01 ETH gas fee increases your cost basis in the 10 ETH by the DKK value of 0.01 ETH at the time of the trade. However, if the fee is paid in a different cryptocurrency (such as paying ETH gas to swap BTC for USDC), the fee itself may be a separate disposal of ETH that must be tracked independently. This creates significant complexity for active traders on high-fee networks.

Declaring on Your Tax Return

Cross trade gains and losses are reported on your Danish annual tax assessment (årsopgørelse) through the TastSelv portal. The reporting follows the same structure as other cryptocurrency transactions: net gains go in box 20 ("Anden personlig indkomst — gevinster"), and net losses go in box 58 ("Øvrige lønmodtagerudgifter — tab"). However, because cross trades generate both a disposal of the outgoing asset and an acquisition of the incoming asset, you must ensure your tracking software or spreadsheet captures both events correctly.

Reporting example: In tax year 2025, Lars executes 50 cross trades. He has 30 trades with a net gain of DKK 120,000 and 20 trades with a net loss of DKK 45,000. Across all cross trades (combined with any fiat sales), his net speculative gain is DKK 75,000. He reports DKK 75,000 in box 20. If Lars instead had a net loss of DKK 30,000 across all trades, he would report DKK 30,000 in box 58. Note that individual cross trade gains and losses are calculated separately per transaction — there is no global pooling of gains and losses across different trades for calculation purposes, only for the final net result reported on the tax return.

SKAT does not require you to list every cross trade individually on your tax return, but you must retain a complete transaction log that can be produced on request during an audit. This log should include for each cross trade: date and time of the trade, exchange or platform where the trade occurred, cryptocurrency disposed (ticker symbol), quantity disposed, DKK proceeds using the priority list valuation method, FIFO cost basis of the disposed units, calculated gain or loss, cryptocurrency acquired (ticker symbol), quantity acquired and cost basis. Many Danish taxpayers use approved crypto tax software (Koinly, CoinTracking, Skatteguiden, CryptoTax) that generates these reports automatically. Learn how to prepare for a SKAT audit →

Documentation Requirements

SKAT requires taxpayers to maintain thorough documentation of all cryptocurrency transactions, including cross trades. The burden of proof is on the taxpayer to demonstrate the accuracy of their reported gains and losses. Inadequate documentation can result in SKAT rejecting your calculations and applying penalties. For each cross trade, you should document the following: transaction ID (TXID) from the blockchain or exchange, timestamps in UTC and local time, the exchange rate used for valuation with source, the specific priority list level used (stablecoin, major crypto, other), any fees paid and their DKK value, the wallet addresses involved (both sending and receiving).

Exchange CSV exports: Centralised exchanges like Kraken, Coinbase, Binance, and Bybit provide downloadable CSV or XLSX transaction history files. These should be saved as at the time of the trade and archived. If SKAT requests documentation, you can provide these exports along with your calculations. For decentralised exchanges, you should use blockchain explorers (Etherscan, Solscan, BscScan) to capture transaction details and save the relevant pages as PDFs. Tools like Etherscan's CSV export feature can download your full transaction history for a given address. Services like Zerion, Zapper, and DeBank provide portfolio-level transaction logs that can be useful for reconstructing cross trade histories across multiple DeFi protocols.

Reconciliation: You should periodically reconcile your cross trade records against your wallet balances to ensure completeness. A common issue is missing transactions — particularly trades executed through aggregator routers (like 1inch, Paraswap) that split a single trade across multiple liquidity pools. These may appear as multiple blockchain transactions for a single economic trade. Ensure you capture the full trade, not just one leg of the split. If you use a hardware wallet (Ledger, Trezor) with multiple addresses, you must track all addresses belonging to your wallet. SKAT considers all addresses you control as part of your portfolio, so transfers between your own addresses are not taxable, but cross trades from any address you control are taxable events.

Binding Rulings for Complex Cases

SKAT offers a binding ruling (bindende svar) process that allows taxpayers to obtain certainty on the tax treatment of specific transactions before they occur. For cross trades, binding rulings may be particularly valuable in the following situations: trades involving complex DeFi protocols where the tax treatment of each step is unclear, trades involving new or novel cryptocurrency assets with no established SKAT guidance, large cross trades exceeding DKK 1,000,000 where the tax consequences are significant, situations where the priority list valuation method produces an ambiguous result (e.g., a trade between two illiquid tokens with no reliable price reference), and cross trades executed through multi-step routing protocols that create uncertainty about which assets were disposed at each step.

The binding ruling application is submitted through SKAT's online system (TastSelv Erhverv) or by written application to SKAT's Centre for Binding Answers (Bindende Svar). The application must include: a detailed description of the proposed transaction, the specific tax question SKAT is asked to answer, the taxpayer's position on the correct tax treatment with supporting legal analysis, all relevant documentation including screenshots, smart contract addresses, and white papers if applicable. SKAT charges a fee for binding rulings, typically between DKK 300 and DKK 1,000 depending on complexity. The processing time is generally 3 to 6 months, though complex cases may take longer. Once issued, a binding answer is binding on SKAT for the specific taxpayer and the specific transaction described, provided the transaction is carried out as described in the application. If the transaction differs materially from the description in the application, the ruling is not binding on SKAT. Refer to the main Denmark crypto tax guide for more SKAT procedures →

Common Cross Trade Mistakes

Danish taxpayers frequently make several mistakes when reporting cross trades. Mistake 1 — treating cross trades as non-taxable: Some taxpayers believe that because they never converted to fiat, no tax is due. This is incorrect — every cross trade is a taxable event regardless of whether DKK or USD ever enters the picture. SKAT has repeatedly confirmed this in binding answers. Mistake 2 — using average cost instead of FIFO: Some crypto tax software defaults to average cost basis (AVCO) rather than FIFO. Denmark mandates FIFO, not average cost. Using the wrong method understates or overstates gains and can trigger penalties if discovered during an audit. Always configure your tax software to use FIFO for Danish reporting. Mistake 3 — netting gains and losses across different cryptocurrencies incorrectly: While the final net result goes in one box, each individual cross trade must be calculated separately. You cannot, for example, add up all your Bitcoin gains and subtract all your Ethereum losses on a trade-by-trade basis if they involve different FIFO pools. Each asset's FIFO pool is independent. Mistake 4 — ignoring gas fees as taxable events: When you pay a gas fee in ETH to execute a cross trade on Ethereum, that ETH payment is itself a disposal of ETH that must be tracked. If you acquired ETH at DKK 10,000 and pay 0.01 ETH in gas when ETH is worth DKK 30,000, you have a taxable gain on that 0.01 ETH disposal (DKK 300 proceeds minus DKK 100 cost basis = DKK 200 gain).

Mistake 5 — failing to convert to DKK correctly: Cross trades often involve USD-pegged stablecoins and USD-denominated exchange prices. You must convert all values to DKK using the exchange rate on the date of the trade. SKAT publishes official exchange rates or you can use the Danish Nationalbank rates. Using incorrect or averaged monthly rates can result in misstated gains. Mistake 6 — not tracking cross trades on DEXs: Centralised exchanges provide transaction history exports, but DEX trades occur directly on the blockchain and may not be automatically recorded in your portfolio tracker. If you trade on Uniswap, Jupiter, or PancakeSwap without logging the transaction, it is easy to forget. Use a blockchain transaction history tool and reconcile regularly. Mistake 7 — confusing cross trades with internal transfers: Moving crypto from one wallet to another that you own is not taxable. However, if the movement involves an exchange of assets (e.g., using a bridge to move ETH from Ethereum to Solana and receiving a wrapped equivalent), the transaction may be a taxable cross trade. Wrapped tokens (WETH, WBTC) are generally treated as the same asset for tax purposes, but bridged variants may not be — consult a tax professional if in doubt.

FAQs

Is swapping stablecoins (e.g., USDC to USDT) a taxable cross trade?

Yes. Even though both stablecoins are pegged to 1 USD, swapping USDC for USDT is a disposal of USDC and an acquisition of USDT. Under FIFO, you must calculate the gain or loss on the USDC leg. In practice, if the stablecoins are trading at their peg, the gain or loss is typically zero or negligible (due to minor price variations), but the transaction must still be tracked for documentation purposes. If either stablecoin has depegged, the gain or loss could be significant.

Can I use the exchange rate from the time of the trade confirmation or the time of block inclusion?

SKAT expects you to use the fair market value at the time the trade is executed. For centralised exchanges, this is typically the trade confirmation timestamp. For DEX trades, this is the block inclusion timestamp. Using a Time-Weighted Average Price (TWAP) over a reasonable window (e.g., 5-15 minutes) around the trade time is generally acceptable if a point-in-time price is not reliably available. You should document your methodology consistently across all trades.

How do I handle cross trades involving wrapped tokens (WETH, WBTC)?

Wrapped tokens like WETH (Wrapped Ethereum) and WBTC (Wrapped Bitcoin) are generally treated as the same asset as their underlying cryptocurrency for Danish tax purposes. Wrapping and unwrapping are not taxable events because there is no change in beneficial ownership — you are simply converting ETH to a compatible ERC-20 representation. However, exchanging WETH for a different asset (like USDC) on a DEX is a taxable cross trade. Maintain separate FIFO pools for wrapped and unwrapped versions but treat cost basis as continuous across the wrap/unwrap.

What if I trade crypto for a token that later turns out to be a scam or rug pull?

If you acquire a token in a cross trade and the token later becomes worthless due to a scam, rug pull, or project failure, your loss is the cost basis you paid (the value of the crypto you gave up). The loss is deductible in box 58 provided you can document the transaction and demonstrate the loss is permanent. SKAT may scrutinise scam losses — keep records of the project's failure, news articles, blockchain evidence of the token's collapse, and any communications about the incident. The loss is treated as a speculative loss, not a capital loss.

Does providing liquidity to a DEX pool with two assets create cross trades?

Depositing a pair of assets (e.g., ETH and USDC) into a liquidity pool is generally not a taxable event because you retain beneficial ownership of the underlying assets. However, when the pool's composition shifts due to trading activity (impermanent loss), this may result in a change in the ratio of assets you own. When you withdraw your liquidity, the assets you receive may be different from what you deposited. This difference can constitute a taxable cross trade at the time of withdrawal. The Danish Tax Council has not issued specific guidance on liquidity pool taxation, so many taxpayers treat the withdrawal as a disposal of the deposited assets and acquisition of the withdrawn assets at market value. Request a binding ruling for large liquidity positions.