<?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: txdecoder.xyz</title>
    <description>The latest articles on DEV Community by txdecoder.xyz (@decoder_man).</description>
    <link>https://dev.to/decoder_man</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3732610%2F2e56f68f-c942-4c9e-8a02-018e0bc65aaf.jpg</url>
      <title>DEV Community: txdecoder.xyz</title>
      <link>https://dev.to/decoder_man</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/decoder_man"/>
    <language>en</language>
    <item>
      <title>Streaming Blocks on Solana: Data Volume, Latency, and Unavoidable Trade-offs</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Tue, 10 Feb 2026 02:21:11 +0000</pubDate>
      <link>https://dev.to/decoder_man/streaming-blocks-on-solana-data-volume-latency-and-unavoidable-trade-offs-103m</link>
      <guid>https://dev.to/decoder_man/streaming-blocks-on-solana-data-volume-latency-and-unavoidable-trade-offs-103m</guid>
      <description>&lt;p&gt;Solana is known for high throughput and low latency.&lt;/p&gt;

&lt;p&gt;But if you are building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a block indexer&lt;/li&gt;
&lt;li&gt;a transaction decoder&lt;/li&gt;
&lt;li&gt;real-time analytics&lt;/li&gt;
&lt;li&gt;monitoring or alerting systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you will quickly realize:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Streaming blocks on Solana is not just about speed —&lt;br&gt;&lt;br&gt;
it’s about managing uncertainty, data volume, and trade-offs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This post walks through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how block streaming actually works on Solana&lt;/li&gt;
&lt;li&gt;the main streaming approaches&lt;/li&gt;
&lt;li&gt;why RPC latency becomes a bottleneck&lt;/li&gt;
&lt;li&gt;and why commitment level choices matter more than you think&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Solana does not really stream “blocks”
&lt;/h2&gt;

&lt;p&gt;Solana is &lt;strong&gt;slot-based&lt;/strong&gt;, not block-based.&lt;/p&gt;

&lt;p&gt;Some important consequences:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a slot occurs roughly every ~400ms&lt;/li&gt;
&lt;li&gt;not every slot produces a block&lt;/li&gt;
&lt;li&gt;blocks may arrive late&lt;/li&gt;
&lt;li&gt;confirmation levels change what data you receive&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when people talk about &lt;em&gt;block streaming on Solana&lt;/em&gt;,&lt;br&gt;&lt;br&gt;
they are really talking about:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;streaming execution results derived from slots, under different guarantees&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every streaming approach is just a different way to deal with this reality.&lt;/p&gt;




&lt;h2&gt;
  
  
  The three main block streaming approaches on Solana
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. RPC polling: latest slot → fetch block
&lt;/h3&gt;

&lt;p&gt;The most basic approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call &lt;code&gt;getSlot&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;fetch block data for that slot: &lt;strong&gt;getBlock / getParsedBlock&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;decode transactions and instructions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is often the first implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it looks appealing&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;simple to reason about&lt;/li&gt;
&lt;li&gt;no persistent connections&lt;/li&gt;
&lt;li&gt;easy to prototype&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it breaks at scale&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;slots can be skipped&lt;/li&gt;
&lt;li&gt;blocks may not exist yet&lt;/li&gt;
&lt;li&gt;retries are frequent&lt;/li&gt;
&lt;li&gt;RPC rate limits are hit quickly&lt;/li&gt;
&lt;li&gt;Large transactions, instruction data cause high latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You end up building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;retry loops&lt;/li&gt;
&lt;li&gt;backfill logic&lt;/li&gt;
&lt;li&gt;slot-to-block reconciliation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At low volume, it works.&lt;br&gt;&lt;br&gt;
At scale, it becomes fragile and expensive.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. WebSocket streaming: &lt;code&gt;blockSubscribe&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;A more event-driven approach:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;subscribe via WebSocket&lt;/li&gt;
&lt;li&gt;receive blocks pushed from the RPC node&lt;/li&gt;
&lt;li&gt;choose commitment level (&lt;code&gt;confirmed&lt;/code&gt; or &lt;code&gt;finalized&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This feels closer to traditional block streaming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;fewer RPC round-trips&lt;/li&gt;
&lt;li&gt;lower latency than polling&lt;/li&gt;
&lt;li&gt;simpler flow control&lt;/li&gt;
&lt;li&gt;fewer RPC call&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;typically limited to &lt;code&gt;confirmed&lt;/code&gt; and &lt;code&gt;finalized&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;processed&lt;/code&gt; is usually unavailable or unreliable&lt;/li&gt;
&lt;li&gt;blocks may still be partial: may miss some instructions / inner instructions&lt;/li&gt;
&lt;li&gt;provider behavior varies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You gain safety and simplicity,&lt;br&gt;&lt;br&gt;
but sacrifice ultra-low latency.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Validator-level streaming: Geyser gRPC
&lt;/h3&gt;

&lt;p&gt;The most powerful — and most complex — option.&lt;/p&gt;

&lt;p&gt;With a &lt;strong&gt;Geyser plugin&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data is streamed directly from validators&lt;/li&gt;
&lt;li&gt;no RPC bottlenecks&lt;/li&gt;
&lt;li&gt;near-zero latency&lt;/li&gt;
&lt;li&gt;full instruction visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is how serious Solana data platforms operate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pros&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;highest completeness&lt;/li&gt;
&lt;li&gt;predictable performance&lt;/li&gt;
&lt;li&gt;minimal retries&lt;/li&gt;
&lt;li&gt;very low latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Cons&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requires validator access or partnerships&lt;/li&gt;
&lt;li&gt;more complex infrastructure&lt;/li&gt;
&lt;li&gt;higher operational cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Geyser does not remove complexity —&lt;br&gt;&lt;br&gt;
it &lt;strong&gt;moves it into infrastructure&lt;/strong&gt;, where it belongs.&lt;/p&gt;




&lt;h2&gt;
  
  
  The hidden cost: Solana block data is large
&lt;/h2&gt;

&lt;p&gt;One of the most underestimated aspects of Solana streaming is &lt;strong&gt;data volume&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A single Solana block can contain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;hundreds or thousands of transactions&lt;/li&gt;
&lt;li&gt;deeply nested instructions&lt;/li&gt;
&lt;li&gt;large inner instruction trees&lt;/li&gt;
&lt;li&gt;verbose account metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This has direct performance consequences.&lt;/p&gt;




&lt;h2&gt;
  
  
  RPC latency becomes the bottleneck
&lt;/h2&gt;

&lt;p&gt;When fetching blocks via RPC:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;response payloads are large&lt;/li&gt;
&lt;li&gt;serialization and deserialization are expensive&lt;/li&gt;
&lt;li&gt;network transfer dominates end-to-end latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;getBlock&lt;/code&gt; often takes &lt;strong&gt;hundreds of milliseconds&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;under load, it can reach seconds&lt;/li&gt;
&lt;li&gt;retries amplify the cost&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even with a fast decoder,&lt;br&gt;&lt;br&gt;
&lt;strong&gt;you are often waiting on the wire&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why polling amplifies latency problems
&lt;/h2&gt;

&lt;p&gt;A typical polling loop looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;getSlot&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;getBlock&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;retry if missing&lt;/li&gt;
&lt;li&gt;refetch if commitment changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now combine that with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;skipped slots&lt;/li&gt;
&lt;li&gt;partial blocks&lt;/li&gt;
&lt;li&gt;confirmation re-checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;high tail latency&lt;/li&gt;
&lt;li&gt;uneven block arrival&lt;/li&gt;
&lt;li&gt;backpressure in your pipeline&lt;/li&gt;
&lt;li&gt;escalating RPC costs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why many Solana indexers feel:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;fast in tests, unstable in production&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Commitment levels are not just a setting
&lt;/h2&gt;

&lt;p&gt;Every Solana streaming setup must answer one question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How wrong am I willing to be, and for how long?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Geyser gRPC: fast and stable at &lt;code&gt;processed&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;With Geyser:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;data comes directly from the validator execution path&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;processed&lt;/code&gt; commitment is commonly used in practice&lt;/li&gt;
&lt;li&gt;latency is extremely low&lt;/li&gt;
&lt;li&gt;stream stability is high&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because execution data is emitted immediately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;blocks arrive consistently&lt;/li&gt;
&lt;li&gt;instruction data is complete&lt;/li&gt;
&lt;li&gt;reprocessing logic is predictable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In practice, &lt;strong&gt;Geyser + &lt;code&gt;processed&lt;/code&gt;&lt;/strong&gt; is often:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the fastest&lt;/li&gt;
&lt;li&gt;and the most operationally stable
streaming setup on Solana.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;real-time decoding&lt;/li&gt;
&lt;li&gt;monitoring systems&lt;/li&gt;
&lt;li&gt;low-latency analytics&lt;/li&gt;
&lt;li&gt;applications that tolerate short-lived reorgs&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  WebSocket &lt;code&gt;blockSubscribe&lt;/code&gt;: safer, but slower
&lt;/h3&gt;

&lt;p&gt;In contrast, &lt;code&gt;blockSubscribe&lt;/code&gt; typically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;supports only &lt;code&gt;confirmed&lt;/code&gt; and &lt;code&gt;finalized&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;does not reliably expose &lt;code&gt;processed&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;varies across RPC providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This leads to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;higher end-to-end latency&lt;/li&gt;
&lt;li&gt;fewer reorgs&lt;/li&gt;
&lt;li&gt;simpler correction logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is safer,&lt;br&gt;&lt;br&gt;
but fundamentally different from validator-level streaming.&lt;/p&gt;




&lt;h2&gt;
  
  
  Streaming doesn’t remove the cost — it shifts it
&lt;/h2&gt;

&lt;p&gt;WebSocket and Geyser reduce:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;redundant RPC calls&lt;/li&gt;
&lt;li&gt;polling overhead&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But they do not change the core reality:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;transaction + instruction data is large&lt;/li&gt;
&lt;li&gt;decoding cost is unavoidable&lt;/li&gt;
&lt;li&gt;memory pressure is real&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Solana, &lt;strong&gt;data size is part of the protocol design&lt;/strong&gt;, not an implementation detail.&lt;/p&gt;




&lt;h2&gt;
  
  
  How &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt; handles Solana block streaming in practice
&lt;/h2&gt;

&lt;p&gt;At &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt;, we treat Solana block streaming as an &lt;strong&gt;infrastructure problem&lt;/strong&gt;, not just an API choice.&lt;/p&gt;

&lt;p&gt;Our production setup uses a &lt;strong&gt;hybrid streaming architecture&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;multiple Geyser gRPC block streaming workers as the primary data source&lt;/li&gt;
&lt;li&gt;an additional WebSocket &lt;code&gt;blockSubscribe&lt;/code&gt; worker as a fallback path&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Why multiple Geyser gRPC workers
&lt;/h3&gt;

&lt;p&gt;Geyser gRPC is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the fastest option&lt;/li&gt;
&lt;li&gt;the most complete in terms of instruction data&lt;/li&gt;
&lt;li&gt;stable enough to run at &lt;code&gt;processed&lt;/code&gt; commitment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But like any long-lived stream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;connections can drop&lt;/li&gt;
&lt;li&gt;validators can restart&lt;/li&gt;
&lt;li&gt;transient network issues do happen&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To handle this, we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run multiple independent Geyser streaming workers&lt;/li&gt;
&lt;li&gt;de-duplicate blocks downstream&lt;/li&gt;
&lt;li&gt;treat each worker as a non-authoritative source&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gives us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;higher availability&lt;/li&gt;
&lt;li&gt;predictable latency&lt;/li&gt;
&lt;li&gt;graceful degradation instead of hard failure&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  WebSocket streaming as a safety net
&lt;/h3&gt;

&lt;p&gt;In addition to Geyser, we maintain a WebSocket &lt;code&gt;blockSubscribe&lt;/code&gt; worker:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;used as a backup when gRPC streams disconnect&lt;/li&gt;
&lt;li&gt;typically running at &lt;code&gt;confirmed&lt;/code&gt; or &lt;code&gt;finalized&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;slower, but more resilient across providers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The WebSocket path is &lt;strong&gt;not the primary data source&lt;/strong&gt; —&lt;br&gt;&lt;br&gt;
it exists to ensure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no long blind spots&lt;/li&gt;
&lt;li&gt;smoother recovery&lt;/li&gt;
&lt;li&gt;continuity during validator-level disruptions&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The key idea: redundancy over perfection
&lt;/h3&gt;

&lt;p&gt;On Solana, no single streaming method is perfect.&lt;/p&gt;

&lt;p&gt;Instead of chasing one “ideal” solution, we:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;combine multiple imperfect streams&lt;/li&gt;
&lt;li&gt;accept short-lived inconsistencies&lt;/li&gt;
&lt;li&gt;resolve them deterministically downstream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This approach allows &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt; to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;stay low-latency under normal conditions&lt;/li&gt;
&lt;li&gt;remain correct under failure&lt;/li&gt;
&lt;li&gt;and avoid catastrophic data gaps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On Solana, resilience is a feature you have to build yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final takeaway
&lt;/h2&gt;

&lt;p&gt;Solana block streaming is not hard because Solana is “bad”.&lt;/p&gt;

&lt;p&gt;It is hard because Solana optimizes for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;throughput&lt;/li&gt;
&lt;li&gt;parallel execution&lt;/li&gt;
&lt;li&gt;low confirmation latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those choices push complexity downstream.&lt;/p&gt;

&lt;p&gt;If you are building Solana data infrastructure,&lt;br&gt;&lt;br&gt;
you are not just streaming blocks —&lt;br&gt;&lt;br&gt;
you are managing &lt;strong&gt;uncertainty, volume, and trade-offs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;There is no perfect approach.&lt;br&gt;&lt;br&gt;
Only conscious ones.&lt;/p&gt;

&lt;h2&gt;
  
  
  About &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Transaction decoding API — standardizing blockchain data into one unified, readable schema on Ethereum, Base, BSC, Solana&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;https://txdecoder.xyz/&lt;/a&gt;&lt;br&gt;
X: &lt;a href="https://x.com/txdecoder_xyz" rel="noopener noreferrer"&gt;https://x.com/txdecoder_xyz&lt;/a&gt;&lt;br&gt;
Telegram: &lt;a href="https://t.me/txdecoder" rel="noopener noreferrer"&gt;https://t.me/txdecoder&lt;/a&gt;&lt;br&gt;
Telegram channel: &lt;a href="https://t.me/txdecoder_announcements" rel="noopener noreferrer"&gt;https://t.me/txdecoder_announcements&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/@txdecoder" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>web3</category>
      <category>decoder</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>🧵 Why Solana tx_hash &amp; address take more storage than EVM</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Sat, 07 Feb 2026 13:21:45 +0000</pubDate>
      <link>https://dev.to/decoder_man/why-solana-txhash-address-take-more-storage-than-evm-5302</link>
      <guid>https://dev.to/decoder_man/why-solana-txhash-address-take-more-storage-than-evm-5302</guid>
      <description>&lt;p&gt;After decoding on-chain transactions and saving to database, I realized that Solana tx_hash, address take more storage than EVM&lt;/p&gt;

&lt;p&gt;👇&lt;/p&gt;

&lt;h2&gt;
  
  
  1️⃣ tx_hash size
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EVM&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hex encoding&lt;/li&gt;
&lt;li&gt;0x + 64 hex chars&lt;/li&gt;
&lt;li&gt;~66 ASCII bytes &lt;code&gt;0-9a-f&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Base58 encoding&lt;/li&gt;
&lt;li&gt;~88–90 ASCII chars &lt;code&gt;1-9A-HJ-NP-Za-km-z&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ Solana tx_hash is ~35–40% larger&lt;/p&gt;

&lt;h2&gt;
  
  
  2️⃣ Address size
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;EVM address&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;20 bytes → hex (40 chars + 0x)&lt;/li&gt;
&lt;li&gt;Strong prefix patterns&lt;/li&gt;
&lt;li&gt;Lower entropy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Solana address&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;32 bytes → base58&lt;/li&gt;
&lt;li&gt;Wider charset&lt;/li&gt;
&lt;li&gt;Higher entropy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ Similar visible length, but Solana compresses worse&lt;/p&gt;

&lt;h2&gt;
  
  
  3️⃣ Compression matters
&lt;/h2&gt;

&lt;p&gt;Storage engines (Snappy / Zstd) love:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;repeated prefixes&lt;/li&gt;
&lt;li&gt;low-entropy strings&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hex (0-9a-f) ≫ Base58 for compression&lt;/p&gt;

&lt;p&gt;➡️ EVM data shrinks better at block level&lt;/p&gt;

&lt;h2&gt;
  
  
  4️⃣ Real-world impact
&lt;/h2&gt;

&lt;p&gt;At scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;billions of txs&lt;/li&gt;
&lt;li&gt;multiple address fields per tx&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small per-field differences&lt;/p&gt;

&lt;p&gt;➡️ huge disk cost difference&lt;/p&gt;

&lt;h2&gt;
  
  
  5️⃣ Takeaway
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Solana optimizes for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;signatures&lt;/li&gt;
&lt;li&gt;runtime&lt;/li&gt;
&lt;li&gt;parallel execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;EVM accidentally optimizes for:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;storage&lt;/li&gt;
&lt;li&gt;analytics&lt;/li&gt;
&lt;li&gt;long-term indexing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Different trade-offs. No winners, just design choices.&lt;/p&gt;




&lt;h2&gt;
  
  
  About &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Transaction decoding API — standardizing blockchain data into one unified, readable schema on Ethereum, Base, BSC, Solana&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;https://txdecoder.xyz/&lt;/a&gt;&lt;br&gt;
X: &lt;a href="https://x.com/txdecoder_xyz" rel="noopener noreferrer"&gt;https://x.com/txdecoder_xyz&lt;/a&gt;&lt;br&gt;
Telegram: &lt;a href="https://t.me/txdecoder" rel="noopener noreferrer"&gt;https://t.me/txdecoder&lt;/a&gt;&lt;br&gt;
Telegram channel: &lt;a href="https://t.me/txdecoder_announcements" rel="noopener noreferrer"&gt;https://t.me/txdecoder_announcements&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/@txdecoder" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>solana</category>
      <category>blockchain</category>
      <category>ethereum</category>
      <category>web3</category>
    </item>
    <item>
      <title>Uniswap V3: When collect() Is More Than “Collect Fees”</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Thu, 05 Feb 2026 23:11:55 +0000</pubDate>
      <link>https://dev.to/decoder_man/uniswap-v3-when-collect-is-more-than-collect-fees-5chj</link>
      <guid>https://dev.to/decoder_man/uniswap-v3-when-collect-is-more-than-collect-fees-5chj</guid>
      <description>&lt;p&gt;Uniswap V3 introduced concentrated liquidity, NFTs for positions, and a much more expressive — but also more subtle — event model.&lt;/p&gt;

&lt;p&gt;One consequence of this design is that on-chain events can be perfectly correct, yet still semantically confusing for end-users.&lt;/p&gt;

&lt;p&gt;A common example is the Collect action.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Common Assumption
&lt;/h2&gt;

&lt;p&gt;For many users (and even some dashboards):&lt;/p&gt;

&lt;p&gt;&lt;code&gt;collect() = collect earned fees&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Happens in Uniswap V3 when user fully exits a position
&lt;/h2&gt;

&lt;p&gt;A Uniswap V3 position is an NFT that tracks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;liquidity&lt;/li&gt;
&lt;li&gt;fee growth inside the tick range&lt;/li&gt;
&lt;li&gt;last fee checkpoints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When a user wants to exit a position, the flow usually looks like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;event: burn -  emit with leftover liquidity amount&lt;/li&gt;
&lt;li&gt;event: collect fee - &lt;strong&gt;emit with leftover liquidity amount + fees earned&lt;/strong&gt; ( the magic thing is here )&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From the protocol’s point of view, this is perfectly valid:&lt;/p&gt;

&lt;p&gt;everything owed to the position is paid out&lt;/p&gt;

&lt;p&gt;all values are emitted correctly in event logs&lt;/p&gt;

&lt;p&gt;But semantically, fees and principal are very different concepts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Explorers Look “Misleading” (But Aren’t Wrong)
&lt;/h2&gt;

&lt;p&gt;Most explorers (Etherscan included) do the right thing at the log level:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Decode Collect events faithfully&lt;/li&gt;
&lt;li&gt;Display the amounts emitted by the contract&lt;/li&gt;
&lt;li&gt;Label the action according to the function/event name&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem is not decoding accuracy.&lt;/p&gt;

&lt;p&gt;The problem is that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Log-level correctness ≠ user-level semantic clarity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For an end-user, seeing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collect: 21.12 USDT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;raises a very different interpretation than:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fees earned: 21.12 USDT&lt;/li&gt;
&lt;li&gt;Liquidity returned: 201,762.98 USDT&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp4mv5mqakve30tqqx6g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkp4mv5mqakve30tqqx6g.png" alt="Etherscan" width="800" height="280"&gt;&lt;/a&gt;&lt;br&gt;
Sample transaction:&lt;br&gt;
&lt;a href="https://etherscan.io/tx/0x77613b2370de015fdf904effea3da3671ead1284279be7b5e0138d3409c51069" rel="noopener noreferrer"&gt;https://etherscan.io/tx/0x77613b2370de015fdf904effea3da3671ead1284279be7b5e0138d3409c51069&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Is Harder Than It Looks
&lt;/h2&gt;

&lt;p&gt;You cannot reliably separate fees vs liquidity by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decode a single event&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To do this correctly, you need to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;decode all event logs in the transaction&lt;/li&gt;
&lt;li&gt;detect remove liquidity event, collect fee event&lt;/li&gt;
&lt;li&gt;extract "Liquidity return" of collect fee earned amount&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frg7ckegfbh8f3q6hopo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frg7ckegfbh8f3q6hopo0.png" alt="Remove Liquidity Event" width="800" height="759"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb4jqtwsigirfjpcsvc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhb4jqtwsigirfjpcsvc7.png" alt="Collect fee event " width="800" height="680"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A Broader Takeaway for On-Chain Data
&lt;/h2&gt;

&lt;p&gt;Events remain low-level and composable&lt;/p&gt;

&lt;p&gt;Meaning emerges only when state is reconstructed&lt;/p&gt;

&lt;p&gt;UX gaps grow between “what happened” and “what users think happened”&lt;/p&gt;

&lt;p&gt;For data builders, this is a reminder:&lt;/p&gt;

&lt;p&gt;Accurate decoding is the baseline.&lt;br&gt;
Semantic decoding is where real understanding begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  About &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt;
&lt;/h2&gt;




&lt;p&gt;Transaction decoding API — standardizing blockchain data into one unified, readable schema on Ethereum, Base, BSC, Solana&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;https://txdecoder.xyz/&lt;/a&gt;&lt;br&gt;
X: &lt;a href="https://x.com/txdecoder_xyz" rel="noopener noreferrer"&gt;https://x.com/txdecoder_xyz&lt;/a&gt;&lt;br&gt;
Telegram: &lt;a href="https://t.me/txdecoder" rel="noopener noreferrer"&gt;https://t.me/txdecoder&lt;/a&gt;&lt;br&gt;
Telegram channel: &lt;a href="https://t.me/txdecoder_announcements" rel="noopener noreferrer"&gt;https://t.me/txdecoder_announcements&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/@txdecoder" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>uniswap</category>
      <category>ethereum</category>
      <category>txdecoder</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Slots and Blocks on Solana — Why You Can’t Think Like EVM</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Mon, 02 Feb 2026 11:18:18 +0000</pubDate>
      <link>https://dev.to/decoder_man/slots-and-blocks-on-solana-why-you-cant-think-like-evm-289g</link>
      <guid>https://dev.to/decoder_man/slots-and-blocks-on-solana-why-you-cant-think-like-evm-289g</guid>
      <description>&lt;p&gt;If you’re coming from EVM chains (Ethereum, Base, BSC, etc.), it’s very tempting to map Solana concepts 1:1 to what you already know.&lt;/p&gt;

&lt;p&gt;That’s where a lot of misunderstandings start.&lt;/p&gt;

&lt;p&gt;On Solana, slots and blocks are not the same thing — and treating them like Ethereum blocks will give you wrong assumptions about time, ordering, and data completeness.&lt;/p&gt;

&lt;p&gt;Let’s break it down.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. What Is a Slot on Solana?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A slot is a logical unit of time in Solana: ~ 400 ms per slot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Each slot has a designated leader&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The leader may produce a block during that slot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Key point:&lt;br&gt;
     - A slot does NOT guarantee a block.&lt;br&gt;
     - Some slots are: Empty, Skipped, Or produce partial data that never becomes finalized&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slot ≠ Block&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  2. What Is a Block on Solana?
&lt;/h2&gt;

&lt;p&gt;A block only exists if the leader successfully produces one for that slot.&lt;/p&gt;

&lt;p&gt;A Solana block:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Is associated with exactly one slot&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Contains:&lt;br&gt;
     - Transactions&lt;br&gt;
     - PoH entries (hashes)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Has:&lt;br&gt;
     - blockTime&lt;br&gt;
     - blockHeight&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; - ❌ Not every slot has a block
 - ❌ Slot numbers are continuous, block heights are not
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sample slot without block &lt;br&gt;
&lt;a href="https://solscan.io/block/397551930" rel="noopener noreferrer"&gt;https://solscan.io/block/397551930&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This already breaks a common EVM assumption.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Compare This to EVM Blocks
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;On Ethereum-style chains:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; - Time is organized by blocks
 - Each block:
         - Advances state
         - Has a parent
         - Has a timestamp
 - No concept of “empty time units”
 - Simplified EVM model:

         - time → block → state
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Solana model is closer to:&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; - time → slot → (maybe) block → state
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  4. Finality and Reorgs Feel Different
&lt;/h2&gt;

&lt;p&gt;Another big mental shift:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;EVM
     - Blocks may reorg
     - Finality is probabilistic (or epoch-based)&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Solana&lt;br&gt;
     - Slots are always advancing&lt;br&gt;
     - Blocks can be:&lt;br&gt;
             - Produced&lt;br&gt;
             - Dropped&lt;br&gt;
             - Replaced before finalization&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; - This means:
         - You may see a block at a slot
         - Then later that block is no longer part of the finalized chain
         - If you index Solana data, you must care about commitment levels: processed, confirmed, finalized
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5. Practical Implications for Data Builders
&lt;/h2&gt;

&lt;p&gt;If you’re building analytics, indexers, or decoders:&lt;/p&gt;

&lt;p&gt;❌ Common mistakes&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Assuming every slot has a block&lt;/li&gt;
&lt;li&gt;Using slot count as a proxy for time&lt;/li&gt;
&lt;li&gt;Treating block height like Ethereum block number&lt;/li&gt;
&lt;li&gt;Assuming monotonic, gapless blocks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ Correct mental model&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slots are the clock&lt;/li&gt;
&lt;li&gt;Blocks are optional outputs&lt;/li&gt;
&lt;li&gt;Finalized data matters more than “first seen” data&lt;/li&gt;
&lt;li&gt;Slot-based APIs ≠ block-based APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  6. TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Slot = time window&lt;/li&gt;
&lt;li&gt;Block = optional result of a slot&lt;/li&gt;
&lt;li&gt;Not every slot has a block&lt;/li&gt;
&lt;li&gt;Solana ≠ fast Ethereum&lt;/li&gt;
&lt;li&gt;Don’t port EVM assumptions into Solana&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re decoding or indexing Solana transactions, this distinction is not academic — it directly affects correctness.&lt;/p&gt;




&lt;p&gt;Curious how others model slot-based data in their pipelines.&lt;br&gt;
How do you handle skipped slots and block finality in practice? 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  About &lt;a href="https://txdecoder.xyz" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Transaction decoding API — standardizing blockchain data into one unified, readable schema on Ethereum, Base, BSC, Solana&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;https://txdecoder.xyz/&lt;/a&gt;&lt;br&gt;
X: &lt;a href="https://x.com/txdecoder_xyz" rel="noopener noreferrer"&gt;https://x.com/txdecoder_xyz&lt;/a&gt;&lt;br&gt;
Telegram: &lt;a href="https://t.me/txdecoder" rel="noopener noreferrer"&gt;https://t.me/txdecoder&lt;/a&gt;&lt;br&gt;
Telegram channel: &lt;a href="https://t.me/txdecoder_announcements" rel="noopener noreferrer"&gt;https://t.me/txdecoder_announcements&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/@txdecoder" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Decoding a block: how fast is fast enough? How many RPC call needed ?</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Tue, 27 Jan 2026 04:25:46 +0000</pubDate>
      <link>https://dev.to/decoder_man/decoding-a-block-how-fast-is-fast-enough-how-many-rpc-call-needed--5e6h</link>
      <guid>https://dev.to/decoder_man/decoding-a-block-how-fast-is-fast-enough-how-many-rpc-call-needed--5e6h</guid>
      <description>&lt;p&gt;For EVM &amp;amp; Solana data builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If decoding a block takes &amp;gt; 3s&lt;/li&gt;
&lt;li&gt;If you need &amp;gt; 3 RPC calls per block&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’re probably over-indexing or doing redundant reads.&lt;/p&gt;

&lt;p&gt;Here’s a real decode log:&lt;br&gt;
&amp;lt;2s end-to-end&lt;br&gt;
2 RPC calls total&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0s29iepglwdxfa58v22l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0s29iepglwdxfa58v22l.png" alt="Decode a block on Solana" width="800" height="185"&gt;&lt;/a&gt;&lt;br&gt;
Would love to hear your thoughts.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why Decoding Uniswap V4 is Harder Than V2 &amp; V3</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Tue, 27 Jan 2026 03:18:46 +0000</pubDate>
      <link>https://dev.to/decoder_man/why-decoding-uniswap-v4-is-harder-than-v2-v3-10b6</link>
      <guid>https://dev.to/decoder_man/why-decoding-uniswap-v4-is-harder-than-v2-v3-10b6</guid>
      <description>&lt;p&gt;&lt;em&gt;A transaction-level, data-engineering perspective&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;When people say “Uniswap V4 is just another AMM version”, that’s only true at the UX level.&lt;br&gt;
From a transaction decoding and on-chain data perspective, V4 is a very different beast.&lt;/p&gt;

&lt;p&gt;If you’ve ever built:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a tx decoder&lt;/li&gt;
&lt;li&gt;an indexer&lt;/li&gt;
&lt;li&gt;a trade analytics pipeline
-or a MEV / monitoring system&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;you’ll immediately feel the difference.&lt;/p&gt;

&lt;p&gt;This post explains why decoding Uniswap V4 is fundamentally harder than V2 and V3, and what changes at the data layer.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. V2 &amp;amp; V3: decoding by pattern recognition
&lt;/h2&gt;

&lt;p&gt;V2/V3 decoding is almost trivial:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One pool = one contract -&amp;gt; Liquidity is balance of pool contract&lt;/li&gt;
&lt;li&gt;Swap logic is fixed&lt;/li&gt;
&lt;li&gt;Key events:

&lt;ul&gt;
&lt;li&gt;Swap&lt;/li&gt;
&lt;li&gt;Mint&lt;/li&gt;
&lt;li&gt;Burn&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;A decoder can:

&lt;ul&gt;
&lt;li&gt;Identify pool address&lt;/li&gt;
&lt;li&gt;Parse Swap event&lt;/li&gt;
&lt;li&gt;Infer: token0 / token1 from pool contract &lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;➡️ Event-driven, deterministic, stateless&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Uniswap V4: everything breaks 😅
&lt;/h2&gt;

&lt;p&gt;Uniswap V4 introduces a paradigm shift, not an iteration.&lt;/p&gt;

&lt;p&gt;The biggest change&lt;/p&gt;

&lt;p&gt;Pools are no longer contracts.&lt;/p&gt;

&lt;p&gt;All pools live inside one singleton contract (PoolManager), and everything is keyed by a PoolId&lt;/p&gt;

&lt;p&gt;That single design choice cascades into multiple decoding problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. PoolId ≠ Pool Address
&lt;/h2&gt;

&lt;p&gt;In Uniswap V4:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;poolId is a bytes32&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Derived from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;token0&lt;/li&gt;
&lt;li&gt;token1&lt;/li&gt;
&lt;li&gt;fee&lt;/li&gt;
&lt;li&gt;tickSpacing&lt;/li&gt;
&lt;li&gt;hooks&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Problems for decoders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No on-chain pool address to index&lt;/li&gt;
&lt;li&gt;No ERC-20 balance per pool&lt;/li&gt;
&lt;li&gt;No direct contract logs per pool&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;➡️ You &lt;strong&gt;must detect event pool initialize&lt;/strong&gt;, save pool information to your local database before you start decoding any transactions of the pool. &lt;/p&gt;

&lt;h2&gt;
  
  
  4. Hooks: decoding without knowing the rules
&lt;/h2&gt;

&lt;p&gt;Hooks are the real game changer.&lt;br&gt;
A pool can attach arbitrary logic at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;beforeSwap&lt;/li&gt;
&lt;li&gt;afterSwap&lt;/li&gt;
&lt;li&gt;beforeModifyPosition&lt;/li&gt;
&lt;li&gt;afterModifyPosition
...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From a decoder’s point of view:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Swap behavior is no longer deterministic&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Token flows may:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;be modified&lt;/li&gt;
&lt;li&gt;be redirected&lt;/li&gt;
&lt;li&gt;be conditionally executed&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Even worse:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hooks are external contracts&lt;/li&gt;
&lt;li&gt;They may emit their own events&lt;/li&gt;
&lt;li&gt;Or emit nothing at all&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;➡️ You cannot decode V4 swaps correctly by reading PoolManager logs alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. One tx ≠ one action
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;- In V2/V3:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   - One swap tx ≈ one swap action
   - transparently token transfers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;- In V4:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   - A single tx can include:
   - multiple pool interactions
   - nested swaps
   - hook-triggered internal swaps
   - non-swap token movements
   - aggregated token movements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;➡️ Decoding becomes stateful, not event-local.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Event semantics are weaker
&lt;/h2&gt;

&lt;p&gt;Another subtle but painful difference:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V2/V3 events are semantic&lt;/strong&gt;&lt;br&gt;
→ “this is a swap, this is mint, this is burn”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V4 logs are often mechanical&lt;/strong&gt;&lt;br&gt;
→ balance deltas, internal calls, state updates&lt;/p&gt;

&lt;p&gt;To reconstruct a “swap”, you may need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;call trace&lt;/li&gt;
&lt;li&gt;storage reads&lt;/li&gt;
&lt;li&gt;hook-specific logic&lt;/li&gt;
&lt;li&gt;token balance diffs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ You’re rebuilding meaning, not parsing events.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Why generic decoders fail on V4
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Most existing decoders assume:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pool = contract&lt;/li&gt;
&lt;li&gt;swap = event&lt;/li&gt;
&lt;li&gt;tokens = known upfront&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;These assumptions fail in V4.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A V4-capable decoder must:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resolve PoolId → PoolKey&lt;/li&gt;
&lt;li&gt;Track pool state off-chain&lt;/li&gt;
&lt;li&gt;Understand hook execution paths&lt;/li&gt;
&lt;li&gt;Aggregate multi-step flows into one semantic action&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ This is closer to program analysis than log parsing.&lt;/p&gt;

&lt;h2&gt;
  
  
  8. Practical implications for infra teams
&lt;/h2&gt;

&lt;p&gt;If you’re building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;analytics dashboards&lt;/li&gt;
&lt;li&gt;tax tools&lt;/li&gt;
&lt;li&gt;MEV monitors&lt;/li&gt;
&lt;li&gt;compliance / forensics&lt;/li&gt;
&lt;li&gt;copy-trading systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Then V4 forces you to rethink:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;indexing strategy&lt;/li&gt;
&lt;li&gt;storage model&lt;/li&gt;
&lt;li&gt;decoding abstractions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;“Just listen to events” is no longer enough.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing thoughts
&lt;/h2&gt;

&lt;p&gt;Uniswap V4 isn’t harder because it’s poorly designed.&lt;br&gt;
It’s harder because it’s more expressive.&lt;br&gt;
That expressiveness moves complexity:&lt;/p&gt;

&lt;p&gt;from smart contracts&lt;/p&gt;

&lt;p&gt;to off-chain decoding and interpretation&lt;/p&gt;

&lt;p&gt;For data engineers and infra builders, V4 is not an upgrade — it’s a new problem class.&lt;/p&gt;




&lt;h2&gt;
  
  
  About &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;txdecoder.xyz&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Transaction decoding API — standardizing blockchain data into one unified, readable schema on Ethereum, Base, BSC, Solana&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;https://txdecoder.xyz/&lt;/a&gt;&lt;br&gt;
X: &lt;a href="https://x.com/txdecoder_xyz" rel="noopener noreferrer"&gt;https://x.com/txdecoder_xyz&lt;/a&gt;&lt;br&gt;
Telegram: &lt;a href="https://t.me/txdecoder" rel="noopener noreferrer"&gt;https://t.me/txdecoder&lt;/a&gt;&lt;br&gt;
Telegram channel: &lt;a href="https://t.me/txdecoder_announcements" rel="noopener noreferrer"&gt;https://t.me/txdecoder_announcements&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/@txdecoder" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>etherjs</category>
    </item>
    <item>
      <title>Transaction Decoding on Ethereum (EVM blockchains ) vs Solana: A Technical Perspective</title>
      <dc:creator>txdecoder.xyz</dc:creator>
      <pubDate>Mon, 26 Jan 2026 09:35:43 +0000</pubDate>
      <link>https://dev.to/decoder_man/transaction-decoding-on-ethereum-evm-blockchains-vs-solana-a-technical-perspective-4kja</link>
      <guid>https://dev.to/decoder_man/transaction-decoding-on-ethereum-evm-blockchains-vs-solana-a-technical-perspective-4kja</guid>
      <description>&lt;p&gt;From an infrastructure perspective, “transaction decoding” is not about parsing bytes.&lt;br&gt;
It is about reconstructing intent from execution artifacts.&lt;/p&gt;

&lt;p&gt;On Ethereum, that intent is primarily encoded through ABIs and event logs.&lt;br&gt;
On Solana, it emerges from instruction flows and account state mutations.&lt;/p&gt;

&lt;p&gt;Treating these two systems as variations of the same decoding problem leads to lossy abstractions and incorrect analytics.&lt;/p&gt;

&lt;p&gt;Before diving into implementation details, it is worth comparing the core primitives that each chain exposes to indexers and data pipelines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Core differences in transaction decoding&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aspect: Primary semantic signal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Event logs emitted during contract executions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instructions executed by programs&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: How user intent is expressed&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Function calls combined with structured event emissions&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ordered instruction sequence with explicit account inputs&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Role of logs / events&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Logs are first-class semantic artifacts designed for off-chain consumption&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;logMessages rarely includes helpful information for semantic artifacts&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Main decoding dependency&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contract ABI (function and event definitions)&lt;/p&gt;

&lt;p&gt;Without the ABI, decoding a transaction into meaningful semantic actions becomes extremely difficult, if not impossible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Program interface (IDL when available) and instruction layout&lt;br&gt;
Without the IDL/ instruction layout, decoding a transaction into meaningful semantic actions still possible in some situation but it’s not make sure we decode enough instructions&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Visibility of internal execution&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Internal calls are mostly opaque unless surfaced via logs&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inner instructions are explicitly exposed and indexed&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Native token movement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only direct native transfer are visible in transaction receipt.&lt;br&gt;
Internal transaction need to trace_debug with archive node, it’s more complicated and expensive&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;SOL transfer, SOL balance change are exposed and indexed&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Semantic signal for action identification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In many cases, the semantic meaning of a user action can be inferred from a single, well-defined event log emitted during execution.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Semantic decoding typically requires correlating the primary program instruction with one or more associated token transfer instructions to reconstruct the full intent.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Related token identification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Token addresses are directly exposed in event logs, allowing decoding logic to identify involved tokens without extra inference.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Transactions expose token accounts rather than the underlying token addresses.&lt;br&gt;
Decoding requires mapping token accounts to their corresponding token mint to determine the actual tokens involved.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Token metadata availability&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Token metadata such as name, symbol, and decimals is available on-chain via standard ERC-20/ERC-721 interfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Only decimals are reliably stored on-chain.&lt;br&gt;
Other metadata like name and symbol is typically stored off-chain (e.g., via metadata accounts in the Token Metadata program).&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Realtime subscription &amp;amp; backfill&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Websocket subscriptions (eth_subscribe) can filter logs by contract address and topic, allowing indexers to receive realtime updates.&lt;br&gt;
Because logs are indexed and immutable, it is also straightforward to backfill historical data to decode a protocol quickly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Websocket subscriptions (programSubscribe) can track realtime transactions affecting a program or account, but there is no topic-like filter.&lt;br&gt;
Filtering must be done client-side by decoding instructions, and there is no native historical backfill, making full protocol reconstruction slower and more resource-intensive.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Protocol-level event authenticity / instruction trust&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Early protocols like Uniswap V2/V3 emitted event logs directly from permissionless pools.&lt;br&gt;
Combined with protocol clones, this made it difficult to distinguish legitimate protocol events from fake or malicious logs.&lt;br&gt;
Modern protocols such as Balancer and Uniswap V4 mitigated this by emitting event logs through a single pool manager, centralizing the semantic signal and improving reliability for indexers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All user actions interact directly with the protocol’s main program ID, similar to Balancer or Uniswap V4.&lt;br&gt;
This design makes it practically impossible to fake user actions by crafting instructions, because malicious transactions cannot target the main program ID without breaking protocol integrity.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Aspect: Dependency on off-chain storage / database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ethereum (EVM)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most transactions can be fully decoded using only on-chain data, without relying on any off-chain storage or local database.&lt;br&gt;
Exception: Protocols like Uniswap V4, Ekubo, and similar, require tracking pool token lists from the pool creation event.&lt;br&gt;
Without storing this information locally, it is nearly impossible to query on-chain later to reconstruct the pool tokens and decode subsequent events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solana&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All transactions can be decoded entirely using on-chain accounts and instruction data, without relying on any off-chain storage.&lt;br&gt;
Since all user actions interact directly with the main program ID, full semantic intent is available on-chain, making decoding reliable without any database.&lt;/p&gt;




&lt;p&gt;I hope this comparison of Ethereum and Solana transaction decoding from a technical perspective was helpful.&lt;/p&gt;

&lt;p&gt;We’re continuously working on improving our understanding and decoding infrastructure, and your feedback is invaluable.&lt;br&gt;
If you have thoughts, suggestions, or corrections, please leave a comment below — we’ll carefully review all input and update this article accordingly.&lt;/p&gt;

&lt;p&gt;Thank you for reading!&lt;/p&gt;




&lt;p&gt;Original URL: &lt;a href="https://medium.com/@txdecoder/transaction-decoding-on-ethereum-evm-blockchains-vs-solana-a-technical-perspective-e531451ca6c7" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder/transaction-decoding-on-ethereum-evm-blockchains-vs-solana-a-technical-perspective-e531451ca6c7&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;About txdecoder.xyz&lt;/p&gt;

&lt;p&gt;Transaction decoding API — standardizing blockchain data into one unified, readable schema on Ethereum, Base, BSC, Solana&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="https://txdecoder.xyz/" rel="noopener noreferrer"&gt;https://txdecoder.xyz/&lt;/a&gt;&lt;br&gt;
X: &lt;a href="https://x.com/txdecoder_xyz" rel="noopener noreferrer"&gt;https://x.com/txdecoder_xyz&lt;/a&gt;&lt;br&gt;
Telegram: &lt;a href="https://t.me/txdecoder" rel="noopener noreferrer"&gt;https://t.me/txdecoder&lt;/a&gt;&lt;br&gt;
Telegram channel: &lt;a href="https://t.me/txdecoder_announcements" rel="noopener noreferrer"&gt;https://t.me/txdecoder_announcements&lt;/a&gt;&lt;br&gt;
Blog: &lt;a href="https://medium.com/@txdecoder" rel="noopener noreferrer"&gt;https://medium.com/@txdecoder&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>solana</category>
      <category>blockchain</category>
      <category>decoder</category>
    </item>
  </channel>
</rss>
