<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: The Crypto Support</title>
    <description>The latest articles on DEV Community by The Crypto Support (@the_crypto_support).</description>
    <link>https://dev.to/the_crypto_support</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4125563%2F3fa7a002-c44b-44ce-875d-eabefc907e75.png</url>
      <title>DEV Community: The Crypto Support</title>
      <link>https://dev.to/the_crypto_support</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/the_crypto_support"/>
    <language>en</language>
    <item>
      <title>Versioning Tax Rules in a Romanian Crypto App</title>
      <dc:creator>The Crypto Support</dc:creator>
      <pubDate>Wed, 16 Sep 2026 17:43:07 +0000</pubDate>
      <link>https://dev.to/the_crypto_support/versioning-tax-rules-in-a-romanian-crypto-app-3f3i</link>
      <guid>https://dev.to/the_crypto_support/versioning-tax-rules-in-a-romanian-crypto-app-3f3i</guid>
      <description>&lt;h2&gt;
  
  
  How to design year-specific Romanian crypto tax rules without scattering rates, thresholds and deadlines throughout your codebase.
&lt;/h2&gt;

&lt;p&gt;Tax rules change.&lt;/p&gt;

&lt;p&gt;Code usually lives much longer.&lt;/p&gt;

&lt;p&gt;That creates an interesting engineering problem when building financial software:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How do you support changing tax rules without filling the codebase with hardcoded conditions?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At &lt;a href="https://thecrypto.support" rel="noopener noreferrer"&gt;The Crypto Support&lt;/a&gt;, we are building crypto tax tooling specifically for users in Romania.&lt;/p&gt;

&lt;p&gt;Romanian crypto reporting is a good example of why tax logic should be treated as &lt;strong&gt;versioned business rules&lt;/strong&gt;, not as constants scattered throughout an application.&lt;/p&gt;

&lt;h2&gt;
  
  
  The dangerous approach
&lt;/h2&gt;

&lt;p&gt;Imagine starting with something simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;TAX_RATE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;That works until you need to calculate a previous tax year.&lt;/p&gt;

&lt;p&gt;Then someone adds:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;year&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;profit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;profit&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Still manageable.&lt;/p&gt;

&lt;p&gt;But tax systems rarely stop at one percentage.&lt;/p&gt;

&lt;p&gt;Soon the application also needs to understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tax years&lt;/li&gt;
&lt;li&gt;income thresholds&lt;/li&gt;
&lt;li&gt;reporting deadlines&lt;/li&gt;
&lt;li&gt;contribution thresholds&lt;/li&gt;
&lt;li&gt;exemptions&lt;/li&gt;
&lt;li&gt;transaction categories&lt;/li&gt;
&lt;li&gt;special cases&lt;/li&gt;
&lt;li&gt;rule changes introduced by new legislation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At that point, business logic starts leaking everywhere.&lt;/p&gt;
&lt;h2&gt;
  
  
  Treat rules as data
&lt;/h2&gt;

&lt;p&gt;A cleaner approach is to represent tax rules explicitly.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;taxRules&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="mi"&gt;2025&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;incomeTaxRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;filingYear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;

  &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;incomeTaxRate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;filingYear&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2027&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now the calculation engine does not decide which percentage "looks current."&lt;/p&gt;

&lt;p&gt;It receives the tax year and loads the rules for that year.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transaction history
        ↓
Determine tax year
        ↓
Load rule set
        ↓
Apply calculations
        ↓
Generate report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This becomes much more useful when rules grow beyond a single rate.&lt;/p&gt;
&lt;h2&gt;
  
  
  Version the whole rule set
&lt;/h2&gt;

&lt;p&gt;Instead of storing only one tax percentage, the configuration can describe everything relevant to that reporting period.&lt;/p&gt;

&lt;p&gt;A simplified structure might look like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"year"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"incomeTaxRate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.16&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"RON"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"filingDeadline"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2027-05-25"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rulesVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2026.1"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The exact structure depends on the application.&lt;/p&gt;

&lt;p&gt;The important part is that a report generated for 2026 should always be reproducible using the &lt;strong&gt;2026 rule set&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;If the rules change in 2027, the historical calculation should not silently change with them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why reproducibility matters
&lt;/h2&gt;

&lt;p&gt;Imagine a user generates a report today.&lt;/p&gt;

&lt;p&gt;Six months later, your application receives a tax-rule update.&lt;/p&gt;

&lt;p&gt;If the user opens the old report again, should its numbers change?&lt;/p&gt;

&lt;p&gt;Usually, no.&lt;/p&gt;

&lt;p&gt;The report should preserve information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tax year&lt;/li&gt;
&lt;li&gt;rules version&lt;/li&gt;
&lt;li&gt;calculation timestamp&lt;/li&gt;
&lt;li&gt;source transactions&lt;/li&gt;
&lt;li&gt;applied assumptions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That gives us something like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Report
├── tax_year: 2026
├── rules_version: 2026.1
├── generated_at: ...
├── transactions: [...]
└── calculations: [...]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Now the result can be reproduced later.&lt;/p&gt;
&lt;h2&gt;
  
  
  Rules and interpretation are not always the same thing
&lt;/h2&gt;

&lt;p&gt;Another reason to avoid hardcoding everything into one calculation function is that some situations may require interpretation.&lt;/p&gt;

&lt;p&gt;A system may have:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SUPPORTED
NEEDS_REVIEW
UNKNOWN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;instead of forcing every transaction into a definitive category.&lt;/p&gt;

&lt;p&gt;For financial software, admitting that a case needs review can be safer than pretending every scenario has a perfectly deterministic answer.&lt;/p&gt;
&lt;h2&gt;
  
  
  Separate legislation from calculation code
&lt;/h2&gt;

&lt;p&gt;Ideally, the calculation engine answers:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Given this rule set and these normalized transactions, what is the result?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It should not also be responsible for deciding which legislation is currently applicable.&lt;/p&gt;

&lt;p&gt;That responsibility belongs to another layer.&lt;/p&gt;

&lt;p&gt;A useful architecture might therefore look like:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transactions
      ↓
Normalization
      ↓
Tax-year selection
      ↓
Rule-set resolver
      ↓
Calculation engine
      ↓
Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each layer has one clear job.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why this matters for Romania
&lt;/h2&gt;

&lt;p&gt;Crypto transactions may look similar globally, but taxation is jurisdiction-specific and time-specific.&lt;/p&gt;

&lt;p&gt;A transaction recorded by an exchange does not contain instructions saying:&lt;/p&gt;

&lt;p&gt;"Apply Romanian rules for tax year 2026."&lt;/p&gt;

&lt;p&gt;That context has to come from the application.&lt;/p&gt;

&lt;p&gt;At The Crypto Support, separating transaction processing from versioned Romanian tax rules makes the system easier to update, test, and audit.&lt;/p&gt;

&lt;p&gt;The goal is not only to calculate the current year correctly.&lt;/p&gt;

&lt;p&gt;It is to still understand &lt;strong&gt;why&lt;/strong&gt; an old report produced its result years later.&lt;/p&gt;

&lt;p&gt;You can read the Romanian tax framework we use as context in our official guide:&lt;/p&gt;


&lt;div class="crayons-card c-embed"&gt;

  &lt;br&gt;
&lt;a href="https://thecrypto.support/en/ghid/taxe-crypto-romania" rel="noopener noreferrer"&gt;Ghid Taxe Crypto România · The Crypto Support&lt;/a&gt;&lt;br&gt;

&lt;/div&gt;






&lt;p&gt;How does your team handle frequent regulatory updates or changing compliance logic in your applications? Have you ever had to audit a historical calculation years down the road? &lt;/p&gt;

&lt;p&gt;Let's discuss in the comments below! 👇&lt;/p&gt;

</description>
      <category>backend</category>
      <category>validation</category>
      <category>cryptocurrency</category>
      <category>programming</category>
    </item>
    <item>
      <title>How a Romanian crypto tax platform can detect missing, duplicated, or inconsistent exchange data before calculations begin.</title>
      <dc:creator>The Crypto Support</dc:creator>
      <pubDate>Wed, 16 Sep 2026 17:38:22 +0000</pubDate>
      <link>https://dev.to/the_crypto_support/how-a-romanian-crypto-tax-platform-can-detect-missing-duplicated-or-inconsistent-exchange-data-5038</link>
      <guid>https://dev.to/the_crypto_support/how-a-romanian-crypto-tax-platform-can-detect-missing-duplicated-or-inconsistent-exchange-data-5038</guid>
      <description>&lt;p&gt;A crypto tax calculation is only as reliable as the transaction data behind it.&lt;/p&gt;

&lt;p&gt;That sounds obvious, but it creates an important engineering problem:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What should the system do when the imported data is incomplete or inconsistent?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At &lt;a href="https://thecrypto.support" rel="noopener noreferrer"&gt;The Crypto Support&lt;/a&gt;, we are building tools for crypto tax reporting in Romania. Before applying any Romania-specific calculation logic, imported exchange data first needs to pass a series of validation checks.&lt;/p&gt;

&lt;p&gt;Otherwise, the software risks producing a very precise answer from bad input.&lt;/p&gt;

&lt;h2&gt;
  
  
  Parsing successfully does not mean the data is correct
&lt;/h2&gt;

&lt;p&gt;Imagine that an exchange CSV contains this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="ld"&gt;2026-03-12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;BUY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;BTC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.02&lt;/span&gt;
&lt;span class="ld"&gt;2026-04-01&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;SELL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;BTC&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;0.03&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The parser may successfully understand both rows.&lt;/p&gt;

&lt;p&gt;But there is an obvious question:&lt;/p&gt;

&lt;p&gt;Where did the extra &lt;code&gt;0.01 BTC&lt;/code&gt; come from?&lt;/p&gt;

&lt;p&gt;Maybe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;another purchase is missing&lt;/li&gt;
&lt;li&gt;the user transferred BTC from another exchange&lt;/li&gt;
&lt;li&gt;an earlier wallet deposit was not imported&lt;/li&gt;
&lt;li&gt;the CSV export covers only part of the year&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a syntax perspective, the data is valid.&lt;/p&gt;

&lt;p&gt;From a financial perspective, it may be incomplete.&lt;/p&gt;

&lt;p&gt;That distinction matters.&lt;/p&gt;
&lt;h2&gt;
  
  
  Validation needs multiple layers
&lt;/h2&gt;

&lt;p&gt;A useful import pipeline can validate data at several levels.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Structural validation
&lt;/h3&gt;

&lt;p&gt;First, check that the file itself can be interpreted.&lt;/p&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;required columns exist&lt;/li&gt;
&lt;li&gt;timestamps are valid&lt;/li&gt;
&lt;li&gt;amounts can be parsed&lt;/li&gt;
&lt;li&gt;currencies are recognized&lt;/li&gt;
&lt;li&gt;transaction types are supported&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A malformed row should not silently become a zero-value transaction.&lt;/p&gt;

&lt;p&gt;It should be reported.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Duplicate detection
&lt;/h3&gt;

&lt;p&gt;Users may accidentally import the same CSV twice.&lt;/p&gt;

&lt;p&gt;Exchanges may also include overlapping periods across multiple exports.&lt;/p&gt;

&lt;p&gt;If duplicate transactions are counted twice, every downstream calculation can be affected.&lt;/p&gt;

&lt;p&gt;A transaction fingerprint could use fields such as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider
source_transaction_id
timestamp
asset
amount
transaction_type
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If the exchange provides a stable transaction ID, that is even better.&lt;/p&gt;

&lt;p&gt;The important point is to detect duplicates before calculation.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Balance consistency
&lt;/h2&gt;

&lt;p&gt;Suppose the normalized history says:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;+0.50 ETH
-0.20 ETH
-0.40 ETH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The calculated balance becomes negative.&lt;/p&gt;

&lt;p&gt;That does not necessarily mean the user did something impossible.&lt;/p&gt;

&lt;p&gt;It usually means some history is missing.&lt;/p&gt;

&lt;p&gt;Maybe ETH was deposited from another wallet.&lt;/p&gt;

&lt;p&gt;Maybe an earlier purchase was excluded from the export.&lt;/p&gt;

&lt;p&gt;The system should surface that inconsistency rather than hiding it.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. Swap reconciliation
&lt;/h2&gt;

&lt;p&gt;Crypto swaps can be particularly tricky.&lt;/p&gt;

&lt;p&gt;Imagine an exchange represents:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BTC → ETH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;as two rows:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELL BTC
BUY ETH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Another provider might export the same operation as one &lt;code&gt;CONVERT&lt;/code&gt; event.&lt;/p&gt;

&lt;p&gt;After normalization, the software needs to know that these records belong to the same economic operation.&lt;/p&gt;

&lt;p&gt;Otherwise, fees and valuations may become disconnected.&lt;/p&gt;

&lt;p&gt;A reconciliation step can try to match records using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timestamps&lt;/li&gt;
&lt;li&gt;source transaction IDs&lt;/li&gt;
&lt;li&gt;asset pairs&lt;/li&gt;
&lt;li&gt;corresponding amounts&lt;/li&gt;
&lt;li&gt;provider metadata&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  5. Missing valuation data
&lt;/h2&gt;

&lt;p&gt;For Romanian reporting, the system may eventually need transaction values expressed consistently in RON.&lt;/p&gt;

&lt;p&gt;That means a transaction should not quietly continue through the pipeline if its required valuation information cannot be determined.&lt;/p&gt;

&lt;p&gt;A useful state might be:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;NEEDS_REVIEW&lt;/span&gt;
&lt;span class="na"&gt;reason&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;MISSING_FIAT_VALUATION&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;instead of:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;value_ron&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Zero is a valid financial value.&lt;/p&gt;

&lt;p&gt;"Unknown" is something completely different.&lt;/p&gt;

&lt;p&gt;Software should not confuse them.&lt;/p&gt;
&lt;h2&gt;
  
  
  Fail loudly, not silently
&lt;/h2&gt;

&lt;p&gt;In many applications, developers try to recover automatically from malformed input.&lt;/p&gt;

&lt;p&gt;Financial software needs to be more careful.&lt;/p&gt;

&lt;p&gt;If a transaction cannot be interpreted confidently, the best behavior may be to stop that transaction from entering the calculation.&lt;/p&gt;

&lt;p&gt;The workflow becomes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Import
   ↓
Parse
   ↓
Normalize
   ↓
Validate
   ↓
Review problems
   ↓
Calculate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This adds friction.&lt;/p&gt;

&lt;p&gt;But it is useful friction.&lt;/p&gt;

&lt;p&gt;A user should know that five transactions need attention before trusting a final tax report.&lt;/p&gt;
&lt;h2&gt;
  
  
  Make validation explainable
&lt;/h2&gt;

&lt;p&gt;Error messages also matter.&lt;/p&gt;

&lt;p&gt;This:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ERROR_CODE_3012
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;is not very helpful.&lt;/p&gt;

&lt;p&gt;Something like this is better:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This BTC disposal could not be matched with sufficient acquisition history. Check whether transactions from another exchange or wallet are missing.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The system should help the user fix the data, not simply reject it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Reliable calculations start before the calculator
&lt;/h2&gt;

&lt;p&gt;For a crypto tax platform built for Romania, the final Romanian tax logic is only one part of the system.&lt;/p&gt;

&lt;p&gt;Before we can calculate anything reliably, we need confidence that the transaction history is complete enough to work with.&lt;/p&gt;

&lt;p&gt;That is why validation belongs between normalization and calculation.&lt;/p&gt;

&lt;p&gt;The basic architecture becomes:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Exchange data
      ↓
Normalization
      ↓
Validation
      ↓
User review
      ↓
Romanian tax logic
      ↓
Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;At The Crypto Support, this is one of the principles behind making crypto tax calculations easier to understand and verify for users in Romania.&lt;/p&gt;

&lt;p&gt;Want to dive deeper into why this matters? Check out the guide below:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://thecrypto.support/en/ghid/de-ce-calculator-taxe-crypto" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fthecrypto.support%2Fblog%2Fde-ce-calculator-taxe-crypto.webp" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://thecrypto.support/en/ghid/de-ce-calculator-taxe-crypto" rel="noopener noreferrer" class="c-link"&gt;
            Crypto tax calculator: why Excel isn’t enough · The Crypto Support
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            50+ transactions across 3 platforms, daily BNR exchange rates, FIFO, swaps reported via DAC-8. Why manually calculating crypto taxes in Excel fails, and what an automated calculator does.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthecrypto.support%2Ffavicon.ico%3Ffavicon.2_a6c6p4yk1td.ico"&gt;
          thecrypto.support
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>backend</category>
      <category>fintech</category>
      <category>dataengineering</category>
      <category>cryptocurrency</category>
    </item>
    <item>
      <title>Why Crypto Tax Calculations Need an Audit Trail</title>
      <dc:creator>The Crypto Support</dc:creator>
      <pubDate>Wed, 16 Sep 2026 17:31:10 +0000</pubDate>
      <link>https://dev.to/the_crypto_support/why-crypto-tax-calculations-need-an-audit-trail-6m</link>
      <guid>https://dev.to/the_crypto_support/why-crypto-tax-calculations-need-an-audit-trail-6m</guid>
      <description>&lt;p&gt;A financial application should not behave like a black box.&lt;/p&gt;

&lt;p&gt;If a crypto tax calculator returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Taxable amount: X RON
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;that result may be useful, but from an engineering perspective it is incomplete.&lt;/p&gt;

&lt;p&gt;The more important question is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can the system explain how it reached that number?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At &lt;a href="https://thecrypto.support" rel="noopener noreferrer"&gt;The Crypto Support&lt;/a&gt;, we are working on crypto tax reporting for users in Romania.&lt;/p&gt;

&lt;p&gt;One of the design principles we care about is preserving a clear path from the final calculation back to the original transaction data.&lt;/p&gt;
&lt;h2&gt;
  
  
  Transactions should not become a black box
&lt;/h2&gt;

&lt;p&gt;Instead of thinking about the system as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Transactions → Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;it is more useful to think of it as:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw transaction
      ↓
Normalized transaction
      ↓
Classification
      ↓
RON valuation
      ↓
Calculation
      ↓
Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Each stage should preserve enough information to understand what happened before it.&lt;/p&gt;

&lt;p&gt;Suppose a user imports a CSV from an exchange.&lt;/p&gt;

&lt;p&gt;The original record should not disappear after parsing.&lt;/p&gt;

&lt;p&gt;The normalized version may change column names, convert timestamps, or restructure the transaction, but it should still reference the original source.&lt;/p&gt;

&lt;p&gt;That gives us &lt;strong&gt;provenance&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Why provenance matters
&lt;/h2&gt;

&lt;p&gt;If a result later looks wrong, we can trace it backwards.&lt;/p&gt;

&lt;p&gt;Maybe:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the original CSV contained a duplicate&lt;/li&gt;
&lt;li&gt;a transaction type was interpreted incorrectly&lt;/li&gt;
&lt;li&gt;an amount was missing&lt;/li&gt;
&lt;li&gt;a historical valuation was wrong&lt;/li&gt;
&lt;li&gt;an acquisition record was unavailable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without provenance, the system only knows that the final number is wrong.&lt;/p&gt;

&lt;p&gt;With provenance, we can investigate &lt;strong&gt;why&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  Crypto swaps make this more important
&lt;/h2&gt;

&lt;p&gt;Consider a simple swap:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BTC → ETH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The user sees one operation.&lt;/p&gt;

&lt;p&gt;The application may need to preserve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;BTC amount leaving&lt;/li&gt;
&lt;li&gt;ETH amount arriving&lt;/li&gt;
&lt;li&gt;transaction timestamp&lt;/li&gt;
&lt;li&gt;fees&lt;/li&gt;
&lt;li&gt;exchange&lt;/li&gt;
&lt;li&gt;original transaction ID&lt;/li&gt;
&lt;li&gt;valuation information&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine a longer sequence:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;BTC → ETH → SOL → EUR
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;If intermediate relationships are lost, the final calculation becomes much harder to explain.&lt;/p&gt;

&lt;p&gt;An audit trail solves more than user-facing transparency.&lt;/p&gt;

&lt;p&gt;It also helps developers.&lt;/p&gt;

&lt;p&gt;When a new exchange integration produces strange results, we can compare the normalized transaction with the original provider data.&lt;/p&gt;

&lt;p&gt;When calculation logic changes, we can rerun the same underlying transaction set.&lt;/p&gt;

&lt;p&gt;When a user reports a problem, we can inspect the transformation path instead of manually reconstructing it.&lt;/p&gt;
&lt;h2&gt;
  
  
  Make intermediate decisions inspectable
&lt;/h2&gt;

&lt;p&gt;For a Romanian crypto tax platform, the architecture should make important decisions traceable.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Original exchange record
        ↓
Normalized transaction
        ↓
Classification
        ↓
RON valuation
        ↓
Calculation decision
        ↓
Final report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Every important transformation should remain inspectable.&lt;/p&gt;

&lt;p&gt;This is also why storing only the final annual total is not enough.&lt;/p&gt;

&lt;p&gt;The final report is just the last stage of a much larger data pipeline.&lt;/p&gt;
&lt;h2&gt;
  
  
  Simple frontend, traceable backend
&lt;/h2&gt;

&lt;p&gt;The complexity should stay behind the interface, but it should not disappear.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://thecrypto.support" rel="noopener noreferrer"&gt;The Crypto Support&lt;/a&gt;, our goal is to make crypto tax reporting in Romania simpler while keeping calculations transparent enough to verify.&lt;/p&gt;

&lt;p&gt;A simple interface and a traceable backend are not opposites.&lt;/p&gt;

&lt;p&gt;For financial software, they should exist together.&lt;/p&gt;

&lt;p&gt;Read more about the problem here:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://thecrypto.support/en/ghid/de-ce-calculator-taxe-crypto" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fthecrypto.support%2Fblog%2Fde-ce-calculator-taxe-crypto.webp" height="auto" class="m-0"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://thecrypto.support/en/ghid/de-ce-calculator-taxe-crypto" rel="noopener noreferrer" class="c-link"&gt;
            Crypto tax calculator: why Excel isn’t enough · The Crypto Support
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            50+ transactions across 3 platforms, daily BNR exchange rates, FIFO, swaps reported via DAC-8. Why manually calculating crypto taxes in Excel fails, and what an automated calculator does.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthecrypto.support%2Ffavicon.ico%3Ffavicon.2_a6c6p4yk1td.ico"&gt;
          thecrypto.support
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>backend</category>
      <category>fintech</category>
      <category>cryptocurrency</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Building a Crypto Tax Calculator for Romania: The Data Problem</title>
      <dc:creator>The Crypto Support</dc:creator>
      <pubDate>Wed, 16 Sep 2026 17:21:53 +0000</pubDate>
      <link>https://dev.to/the_crypto_support/building-a-crypto-tax-calculator-for-romania-the-data-problem-5fbl</link>
      <guid>https://dev.to/the_crypto_support/building-a-crypto-tax-calculator-for-romania-the-data-problem-5fbl</guid>
      <description>&lt;p&gt;When people hear &lt;strong&gt;"crypto tax calculator"&lt;/strong&gt;, the obvious assumption is that the difficult part is the tax formula.&lt;/p&gt;

&lt;p&gt;In practice, a large part of the engineering challenge comes &lt;strong&gt;before any tax logic is applied&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;At &lt;a href="https://thecrypto.support" rel="noopener noreferrer"&gt;The Crypto Support&lt;/a&gt;, we are building tools for crypto tax reporting in Romania. One of the first problems we encountered was that transaction data from different exchanges rarely follows the same structure.&lt;/p&gt;

&lt;p&gt;A user may think of their activity as simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I bought Bitcoin, swapped some of it for ETH, then sold part of it later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The software sees something very different.&lt;/p&gt;

&lt;h2&gt;
  
  
  Different exchanges, different data
&lt;/h2&gt;

&lt;p&gt;One exchange may export:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;Date&lt;/span&gt;
&lt;span class="k"&gt;Type&lt;/span&gt;
&lt;span class="k"&gt;Asset&lt;/span&gt;
&lt;span class="k"&gt;Amount&lt;/span&gt;
&lt;span class="k"&gt;Price&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Another may use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight csvs"&gt;&lt;code&gt;&lt;span class="k"&gt;Timestamp&lt;/span&gt;
&lt;span class="k"&gt;Operation&lt;/span&gt;
&lt;span class="k"&gt;Currency&lt;/span&gt;
&lt;span class="k"&gt;Quantity&lt;/span&gt;
&lt;span class="k"&gt;Total&lt;/span&gt;
&lt;span class="k"&gt;Fee&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A third platform may split what the user considers one operation into multiple rows.&lt;/p&gt;

&lt;p&gt;Before we can apply any Romania-specific tax logic, all of this data has to be converted into a consistent internal representation.&lt;/p&gt;

&lt;p&gt;That is the &lt;strong&gt;normalization layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A normalized transaction might contain information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;timestamp&lt;/li&gt;
&lt;li&gt;source exchange&lt;/li&gt;
&lt;li&gt;outgoing asset&lt;/li&gt;
&lt;li&gt;incoming asset&lt;/li&gt;
&lt;li&gt;amounts&lt;/li&gt;
&lt;li&gt;fees&lt;/li&gt;
&lt;li&gt;original transaction ID&lt;/li&gt;
&lt;li&gt;value used for later calculations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important idea is separation.&lt;/p&gt;

&lt;p&gt;The tax layer should not care whether a transaction originally came from Binance, Kraken, Coinbase, or another provider.&lt;/p&gt;

&lt;p&gt;It should receive a clean transaction object with a predictable structure.&lt;/p&gt;

&lt;h2&gt;
  
  
  A simplified pipeline
&lt;/h2&gt;

&lt;p&gt;Conceptually, the pipeline looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Raw exchange data
        ↓
Provider-specific parser
        ↓
Normalized transaction
        ↓
Classification
        ↓
RON valuation
        ↓
Tax calculation
        ↓
Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This architecture also makes debugging easier.&lt;/p&gt;

&lt;p&gt;Imagine the final result looks incorrect.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Why is the final number wrong?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;we can ask more useful questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was the CSV parsed incorrectly?&lt;/li&gt;
&lt;li&gt;Was the transaction classified incorrectly?&lt;/li&gt;
&lt;li&gt;Was the RON valuation wrong?&lt;/li&gt;
&lt;li&gt;Was some acquisition information missing?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That traceability matters even more in financial software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation before calculation
&lt;/h2&gt;

&lt;p&gt;A malformed date is not just a formatting issue.&lt;/p&gt;

&lt;p&gt;It can affect the value assigned to a transaction.&lt;/p&gt;

&lt;p&gt;A duplicated transaction can alter the final calculation.&lt;/p&gt;

&lt;p&gt;A missing acquisition record can make a later disposal difficult to interpret correctly.&lt;/p&gt;

&lt;p&gt;Useful validation checks include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;duplicate transaction IDs&lt;/li&gt;
&lt;li&gt;missing timestamps&lt;/li&gt;
&lt;li&gt;unsupported transaction types&lt;/li&gt;
&lt;li&gt;missing amounts&lt;/li&gt;
&lt;li&gt;inconsistent swap records&lt;/li&gt;
&lt;li&gt;missing valuations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes the correct behavior is &lt;strong&gt;not&lt;/strong&gt; to calculate automatically.&lt;/p&gt;

&lt;p&gt;It is to tell the user that a transaction needs review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Global crypto data, local Romanian rules
&lt;/h2&gt;

&lt;p&gt;The other interesting challenge is that crypto data is global while taxation is local.&lt;/p&gt;

&lt;p&gt;An exchange does not export a special "Romania CSV".&lt;/p&gt;

&lt;p&gt;A blockchain transaction does not know anything about Romanian tax reporting.&lt;/p&gt;

&lt;p&gt;The software first has to answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What happened?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Only afterwards can another layer answer:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How should this transaction be interpreted in the Romanian reporting context?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That separation is one of the main architectural principles behind The Crypto Support.&lt;/p&gt;

&lt;p&gt;The user experience should remain simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Import → Verify → Calculate → Report
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But making that workflow simple requires a lot of structure underneath it.&lt;/p&gt;

&lt;p&gt;You can read more about why dedicated tooling becomes useful for Romanian crypto users here:&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://thecrypto.support/ghid/en/de-ce-calculator-taxe-crypto" rel="noopener noreferrer"&gt;read our guide on why dedicated tooling is useful for Romanian crypto users&lt;/a&gt; for more details&lt;/p&gt;

</description>
      <category>cryptocurrency</category>
      <category>romania</category>
      <category>programming</category>
      <category>fintech</category>
    </item>
  </channel>
</rss>
