Category: XML Templates Last Updated: 2026-02-12 Applies To: EU DAC8 / OECD CARF XML Schema

---

Overview

DAC8/CARF reporting requires Reporting Crypto-Asset Service Providers (RCASPs) to report aggregate transaction values rather than individual transaction details. This means you must sum up all transactions of a given type, for a given crypto-asset, for each reportable user, across the entire calendar year. Getting the aggregation logic right -- including currency conversion, rounding, and handling of multiple crypto-assets -- is essential for accurate reporting.

This article covers the practical rules for calculating aggregate values.

Aggregation Dimensions

Every TransactionSummary in the XML is aggregated along three dimensions:

  1. User -- each AccountReport covers one reportable person
  2. Transaction type -- exchange (fiat), exchange (crypto), transfer, retail payment
  3. Crypto-asset -- each distinct crypto-asset is reported separately

This means that for a user who traded BTC and ETH in both exchange and transfer transactions, you would produce four TransactionSummary blocks within their AccountReport.

What Gets Aggregated

For each TransactionSummary, you must calculate:

FieldWhat to Aggregate
NumberOfTransactionsCount of completed transactions matching the type and asset
AggregateGrossProceedsSum of gross proceeds in reporting currency (for exchanges/payments)
AggregateTransferValueSum of fair market values in reporting currency (for transfers)
TotalUnitsSum of crypto-asset units involved in the transactions

Example Calculation

Suppose a user made the following BTC-to-EUR exchange transactions in 2025:

DateBTC SoldEUR Received
2025-03-150.103,200.00
2025-06-220.258,750.00
2025-11-010.5016,500.00

The aggregated values would be:

<TransactionSummary>
  <TransactionType>EXCHANGE_FIAT</TransactionType>
  <NumberOfTransactions>3</NumberOfTransactions>
  <AggregateGrossProceeds currCode="EUR">28450.00</AggregateGrossProceeds>
  <CryptoAssetDetails>
    <AssetCode>BTC</AssetCode>
    <TotalUnits>0.85000000</TotalUnits>
  </CryptoAssetDetails>
</TransactionSummary>

Currency Conversion Rules

Reporting Currency

All aggregate values must be expressed in the reporting currency. For EU member states, this is typically the Euro (EUR), though some non-eurozone member states may accept their national currency. Verify with your local tax authority which currency to use.

Exchange Rate Source

When a transaction occurs in a currency other than the reporting currency, you must convert it. The OECD CARF framework generally expects you to use:

  • The exchange rate at the time of the transaction, or
  • A reasonable and consistently applied methodology (e.g., daily closing rates from the European Central Bank)

Important: Whichever method you choose, apply it consistently across all transactions and all users. Do not mix methods. Document your chosen methodology.

Practical Conversion Example

A user sells 1.0 ETH and receives 2,500 USD on 2025-04-10. The ECB EUR/USD rate on that date is 1.08.

Gross proceeds in EUR = 2,500 / 1.08 = 2,314.81 EUR

This EUR value is what you add to the AggregateGrossProceeds for this user's ETH exchange transactions.

Crypto-to-Crypto Conversion

For crypto-to-crypto exchanges, there is no fiat amount. You must determine the fair market value of the crypto-asset disposed of (or acquired) at the time of the trade. Typically:

  1. Take the market price of the disposed crypto-asset at the time of the trade (from your platform's price feed or a reputable market data provider)
  2. Convert that value to the reporting currency using the applicable exchange rate
User swaps 2.0 ETH for 0.08 BTC on 2025-07-15
ETH price at time of trade: 1,800 USD
EUR/USD rate: 1.10

Fair market value = 2.0 * 1,800 / 1.10 = 3,272.73 EUR

Handling Multiple Crypto-Assets

Each crypto-asset requires its own TransactionSummary block within the same transaction type. Do not combine different crypto-assets into a single summary.

<!-- Correct: separate summaries per asset -->
<TransactionSummary>
  <TransactionType>EXCHANGE_FIAT</TransactionType>
  <NumberOfTransactions>10</NumberOfTransactions>
  <AggregateGrossProceeds currCode="EUR">15000.00</AggregateGrossProceeds>
  <CryptoAssetDetails>
    <AssetCode>BTC</AssetCode>
    <TotalUnits>0.50000000</TotalUnits>
  </CryptoAssetDetails>
</TransactionSummary>

<TransactionSummary>
  <TransactionType>EXCHANGE_FIAT</TransactionType>
  <NumberOfTransactions>25</NumberOfTransactions>
  <AggregateGrossProceeds currCode="EUR">8200.00</AggregateGrossProceeds>
  <CryptoAssetDetails>
    <AssetCode>ETH</AssetCode>
    <TotalUnits>4.20000000</TotalUnits>
  </CryptoAssetDetails>
</TransactionSummary>

Rounding Rules

Monetary Values

The CARF schema typically allows two decimal places for monetary amounts. Round to two decimal places using standard rounding (round half up):

  • 1,234.565 rounds to 1,234.57
  • 1,234.564 rounds to 1,234.56

Apply rounding to each individual transaction value before aggregation, or aggregate first and then round the total. Whichever approach you choose, be consistent. Rounding individual transactions first may produce slightly different results than rounding the total, but the difference should be negligible.

> Caution: Some jurisdictions may specify a particular rounding approach. Check local guidance.

Crypto-Asset Units

Crypto-asset units (TotalUnits) should be reported with sufficient decimal precision to avoid material rounding errors. For Bitcoin, 8 decimal places (satoshi precision) is standard. For other assets, use the precision native to the asset.

<!-- Bitcoin: 8 decimal places -->
<TotalUnits>0.85000000</TotalUnits>

<!-- Ethereum: 18 decimal places natively, but 8 is typically sufficient for reporting -->
<TotalUnits>4.20000000</TotalUnits>

Fees Handling

Whether platform fees and network fees should be included in or excluded from gross proceeds is a question that may vary by jurisdiction. Consider:

  • Platform trading fees: If the user sells 1 BTC and receives 28,000 EUR after a 50 EUR fee, is the gross proceeds 28,000 or 28,050?
  • Network/gas fees: If the user transfers 1 ETH but 0.005 ETH is consumed as gas, is the transfer value based on 1.0 ETH or 0.995 ETH?

Recommendation: Follow the OECD CARF commentary and local jurisdiction guidance. If no specific guidance is available, report gross proceeds before the deduction of platform fees (i.e., the full consideration the user received or disposed of), and document your approach.

SQL Aggregation Example

SELECT
    u.user_id,
    u.tax_residence_country,
    CASE
        WHEN t.type = 'sell' AND t.fiat_currency IS NOT NULL THEN 'EXCHANGE_FIAT'
        WHEN t.type = 'swap' THEN 'EXCHANGE_CRYPTO'
        WHEN t.type = 'withdrawal' THEN 'TRANSFER'
    END AS transaction_type,
    t.crypto_asset,
    COUNT(*) AS num_transactions,
    ROUND(SUM(t.value_eur), 2) AS aggregate_value_eur,
    SUM(t.crypto_amount) AS total_units
FROM transactions t
JOIN users u ON u.user_id = t.user_id
WHERE t.executed_at >= '2026-01-01'
  AND t.executed_at < '2027-01-01'
  AND t.status = 'completed'
GROUP BY
    u.user_id,
    u.tax_residence_country,
    transaction_type,
    t.crypto_asset
ORDER BY u.user_id, transaction_type, t.crypto_asset;

Validation Checks

Before generating XML, verify your aggregated data:

  • No AggregateGrossProceeds or AggregateTransferValue is negative
  • NumberOfTransactions is a positive integer
  • TotalUnits is positive
  • Currency codes are valid ISO 4217
  • All values are in the same reporting currency
  • No duplicate aggregation rows (same user + type + asset appearing twice)

Need help with DAC8 reporting?

Our team handles XML generation, TIN validation, and submission for CASPs across all 27 EU Member States.

Get Expert Help