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:
- User -- each
AccountReportcovers one reportable person - Transaction type -- exchange (fiat), exchange (crypto), transfer, retail payment
- 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:
| Field | What to Aggregate |
|---|---|
NumberOfTransactions | Count of completed transactions matching the type and asset |
AggregateGrossProceeds | Sum of gross proceeds in reporting currency (for exchanges/payments) |
AggregateTransferValue | Sum of fair market values in reporting currency (for transfers) |
TotalUnits | Sum of crypto-asset units involved in the transactions |
Example Calculation
Suppose a user made the following BTC-to-EUR exchange transactions in 2025:
| Date | BTC Sold | EUR Received |
|---|---|---|
| 2025-03-15 | 0.10 | 3,200.00 |
| 2025-06-22 | 0.25 | 8,750.00 |
| 2025-11-01 | 0.50 | 16,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:
- 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)
- 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
AggregateGrossProceedsorAggregateTransferValueis negative NumberOfTransactionsis a positive integerTotalUnitsis 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.