<?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: Hauwa Ibrahim</title>
    <description>The latest articles on DEV Community by Hauwa Ibrahim (@hxrh).</description>
    <link>https://dev.to/hxrh</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%2F3886574%2Fb998001c-cc79-4ff3-b378-b4515103828e.png</url>
      <title>DEV Community: Hauwa Ibrahim</title>
      <link>https://dev.to/hxrh</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hxrh"/>
    <language>en</language>
    <item>
      <title>Solana’s account model isn’t scary. It’s just a filing cabinet.</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Sat, 23 May 2026 03:13:49 +0000</pubDate>
      <link>https://dev.to/hxrh/solanas-account-model-isnt-scary-its-just-a-filing-cabinet-3mjk</link>
      <guid>https://dev.to/hxrh/solanas-account-model-isnt-scary-its-just-a-filing-cabinet-3mjk</guid>
      <description>&lt;p&gt;Hey, Web2 friend.&lt;/p&gt;

&lt;p&gt;You’ve built REST APIs. You’ve stored sessions in Redis. You’ve wrestled with PostgreSQL at 3 AM.&lt;/p&gt;

&lt;p&gt;Now you’re peeking into Solana, and someone hit you with the phrase: &lt;em&gt;“Everything is an account.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Your first thought is probably: &lt;em&gt;“Uh oh. Another abstract blockchain thing I have to memorize.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I promise, it’s not that bad.&lt;/p&gt;

&lt;p&gt;In fact, if you’ve ever used a &lt;strong&gt;filesystem&lt;/strong&gt; or a &lt;strong&gt;key-value store&lt;/strong&gt;, you already understand 80% of Solana’s account model. Let me show you what I mean.&lt;/p&gt;




&lt;h2&gt;
  
  
  One model to rule them all
&lt;/h2&gt;

&lt;p&gt;Ethereum has two types of accounts:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Externally owned accounts&lt;/strong&gt; (wallets)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contract accounts&lt;/strong&gt; (smart contracts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Solana says: &lt;em&gt;“Nah, that’s too complicated. Let’s just have one.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On Solana, &lt;strong&gt;everything&lt;/strong&gt; is an account.&lt;br&gt;&lt;br&gt;
Your wallet? Account.&lt;br&gt;&lt;br&gt;
A program (smart contract)? Account.&lt;br&gt;&lt;br&gt;
A single token balance? Also an account.&lt;br&gt;&lt;br&gt;
An NFT’s metadata? You guessed it. Account.&lt;/p&gt;

&lt;p&gt;The whole blockchain is basically a giant &lt;strong&gt;key-value store&lt;/strong&gt;.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Key&lt;/strong&gt;: a 32-byte address (looks like a long random string)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Value&lt;/strong&gt;: the account itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it. Flat. Simple. No nesting. No inheritance. Just a big hash map in the sky.&lt;/p&gt;


&lt;h2&gt;
  
  
  What’s actually inside an account?
&lt;/h2&gt;

&lt;p&gt;Every account on Solana has exactly &lt;strong&gt;five fields&lt;/strong&gt;. No more, no less.&lt;/p&gt;

&lt;p&gt;Here’s what one looks like (simplified):&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;"lamports"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;890000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"owner"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"SystemProgram"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"executable"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rent_epoch"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;18446744073709551615&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;Let’s walk through them like normal humans.&lt;/p&gt;

&lt;h3&gt;
  
  
  🪙 lamports – the “storage rent” piggy bank
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;lamports&lt;/code&gt; is just SOL measured in tiny units (1 SOL = 1 billion lamports).&lt;br&gt;&lt;br&gt;
To keep an account alive on Solana, it needs a minimum balance. Think of it like a security deposit so you don’t spam the network with junk data.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Web2 terms: you pay AWS for EBS storage. Same vibe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  📦 data – the actual stuff
&lt;/h3&gt;

&lt;p&gt;This is a byte array. Could be anything.  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the account is a &lt;strong&gt;program&lt;/strong&gt;, this holds executable code.
&lt;/li&gt;
&lt;li&gt;If it’s a &lt;strong&gt;data account&lt;/strong&gt;, this holds JSON, numbers, token balances, or whatever the app needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No separate database. No ORM. Just bytes.&lt;/p&gt;

&lt;h3&gt;
  
  
  👑 owner – who’s allowed to touch this?
&lt;/h3&gt;

&lt;p&gt;This is the &lt;strong&gt;only&lt;/strong&gt; program that can modify the account’s data or spend its lamports.&lt;/p&gt;

&lt;p&gt;Anyone can &lt;em&gt;send&lt;/em&gt; lamports &lt;em&gt;to&lt;/em&gt; the account. But changing the data? That requires permission from the owner.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Web2 analogy: only the &lt;code&gt;root&lt;/code&gt; user or the file owner can &lt;code&gt;chmod&lt;/code&gt; a file.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  🧠 executable – is this code or data?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;true&lt;/code&gt; → this account is a program (smart contract)
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;false&lt;/code&gt; → this account is just holding data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s it. No third option.&lt;/p&gt;

&lt;h3&gt;
  
  
  ⏳ rent_epoch – ignore this
&lt;/h3&gt;

&lt;p&gt;Honestly? Ignore it. It’s deprecated. For all modern accounts, it’s just set to the maximum number. Move along.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part that surprises most Web2 devs
&lt;/h2&gt;

&lt;p&gt;Here’s where Solana flips the script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Programs don’t store their own state.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Wait, what?&lt;/p&gt;

&lt;p&gt;In Web2, your server (program) keeps things in memory or connects to a database. The code and the data live in the same place conceptually.&lt;/p&gt;

&lt;p&gt;On Solana:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Program account&lt;/strong&gt; = the logic (like a read-only function)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data account&lt;/strong&gt; = the state (like a row in a table)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They are &lt;strong&gt;separate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A program can read and write to &lt;em&gt;many&lt;/em&gt; data accounts, but it never “remembers” anything on its own between transactions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think of a program like a pure function. Give it data accounts as input. It gives you new data accounts as output. No hidden globals. No singletons.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is weird at first. But it’s also beautiful.&lt;br&gt;&lt;br&gt;
It’s why Solana can run thousands of transactions in parallel — because transactions that touch different data accounts don’t conflict.&lt;/p&gt;




&lt;h2&gt;
  
  
  A tiny note on rent (but not scary rent)
&lt;/h2&gt;

&lt;p&gt;Solana used to charge “rent” over time. That’s gone.&lt;/p&gt;

&lt;p&gt;Now you just need to be &lt;strong&gt;rent-exempt&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
That means your account holds enough lamports for its data size. For a basic account with no extra data, that’s about &lt;strong&gt;0.00089 SOL&lt;/strong&gt; (roughly a fraction of a penny).&lt;/p&gt;

&lt;p&gt;Pay it once. Account stays forever. No monthly bills.&lt;/p&gt;




&lt;h2&gt;
  
  
  So… what do I actually remember?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If you know this from Web2&lt;/th&gt;
&lt;th&gt;You already understand Solana&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Key-value store (Redis, Dynamo)&lt;/td&gt;
&lt;td&gt;The whole blockchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;File permissions (chown, chmod)&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;owner&lt;/code&gt; field&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executable vs. data file&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;executable&lt;/code&gt; boolean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paying for disk space&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;lamports&lt;/code&gt; for rent exemption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stateless functions&lt;/td&gt;
&lt;td&gt;Programs don’t store state&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  You’ve got this
&lt;/h2&gt;

&lt;p&gt;The account model is the foundation of &lt;em&gt;everything&lt;/em&gt; on Solana.&lt;br&gt;&lt;br&gt;
Tokens? Accounts.&lt;br&gt;&lt;br&gt;
NFTs? Accounts.&lt;br&gt;&lt;br&gt;
Governance votes? Also accounts.&lt;/p&gt;

&lt;p&gt;Once you stop thinking in “classes and objects” and start thinking in “files and permissions,” Solana becomes much less intimidating.&lt;/p&gt;

&lt;p&gt;You don’t need to write a smart contract tomorrow.&lt;br&gt;&lt;br&gt;
Just sit with the model for a day.&lt;br&gt;&lt;br&gt;
Look up an account on &lt;a href="https://explorer.solana.com" rel="noopener noreferrer"&gt;Solana Explorer&lt;/a&gt;.&lt;br&gt;&lt;br&gt;
See those five fields with your own eyes.&lt;/p&gt;

&lt;p&gt;That’s the moment it clicks.&lt;/p&gt;

&lt;p&gt;And when it does? You’re officially thinking like a Solana dev.&lt;/p&gt;

&lt;p&gt;Happy building &lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>writing</category>
      <category>solana</category>
    </item>
    <item>
      <title>Your Node.js Version Will Break Solana (And How to Fix It)</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Thu, 21 May 2026 21:30:51 +0000</pubDate>
      <link>https://dev.to/hxrh/your-nodejs-version-will-break-solana-and-how-to-fix-it-57ea</link>
      <guid>https://dev.to/hxrh/your-nodejs-version-will-break-solana-and-how-to-fix-it-57ea</guid>
      <description>&lt;h3&gt;
  
  
  The Headline That Would've Saved Me 72 Hours
&lt;/h3&gt;

&lt;p&gt;Let me start with a confession:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I spent three days debugging code that wasn't broken.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code was fine. The logic was correct. The Solana API was working.&lt;/p&gt;

&lt;p&gt;The problem? &lt;strong&gt;My Node.js version.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And nobody told me.&lt;/p&gt;

&lt;p&gt;So here I am, three days later, writing what I wish someone had written for me.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Setup: This Should've Been Easy
&lt;/h2&gt;

&lt;p&gt;I'm a developer. Not a blockchain expert. Not a crypto bro. Just web 2 developer curious about web 3.&lt;/p&gt;

&lt;p&gt;I wanted to build something simple for my #100DaysOfSolana challenge:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take a Solana address&lt;/li&gt;
&lt;li&gt;Fetch its balance&lt;/li&gt;
&lt;li&gt;Display account info&lt;/li&gt;
&lt;li&gt;Done. 15 minutes. Maybe 30.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found the code in the Solana tutorials provided:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana/kit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.devnet.solana.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;targetAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;balanceLamports&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetAddress&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Balance: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balanceLamports&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000_000&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; SOL`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean. Simple. Modern JavaScript.&lt;/p&gt;

&lt;p&gt;I ran it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node explorer.mjs TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then the nightmare began.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 1: The First Crash
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Error [ERR_MODULE_NOT_FOUND]: Cannot find package '/home/.../node_modules/@solana/kit/'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;My reaction:&lt;/strong&gt; "Oh, dumb mistake. Forgot to install it."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; @solana/kit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;npm warn EBADENGINE Unsupported engine {
  package: '@solana/codecs-core@2.3.0',
&lt;/span&gt;&lt;span class="gp"&gt;  required: { node: '&amp;gt;&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20.18.0&lt;span class="s1"&gt;' },
&lt;/span&gt;&lt;span class="go"&gt;  current: { node: 'v18.20.8' }
}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;My reaction:&lt;/strong&gt; "A warning. Whatever. It'll probably work."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Spoiler alert:&lt;/strong&gt; It did not work.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 2: The Spiral
&lt;/h2&gt;

&lt;p&gt;I spent hours Googling and ChatGPTing lol. Every answer sent me down a different rabbit hole:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;"Try clearing your cache"&lt;/li&gt;
&lt;li&gt;"Reinstall node_modules"&lt;/li&gt;
&lt;li&gt;"Check your package.json"&lt;/li&gt;
&lt;li&gt;"Use a different RPC endpoint"&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing worked.&lt;/p&gt;

&lt;p&gt;I checked my &lt;code&gt;package.json&lt;/code&gt;:&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;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"@solana/kit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^0.0.0"&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;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;&lt;strong&gt;Wait. ^0.0.0?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's not a real version. That's a placeholder.&lt;br&gt;
So I fixed it:&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;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&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;span class="nl"&gt;"@solana/kit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.5.0"&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;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;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; node_modules package-lock.json
npm &lt;span class="nb"&gt;install
&lt;/span&gt;node explorer.mjs TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same error. Nothing changed.&lt;/p&gt;

&lt;p&gt;I was losing my mind.&lt;/p&gt;




&lt;h2&gt;
  
  
  Day 3: The Breakthrough
&lt;/h2&gt;

&lt;p&gt;After hours of debugging, I re-read that warning from Day 1:&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="err"&gt;required:&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;span class="err"&gt;node:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&amp;gt;=&lt;/span&gt;&lt;span class="mf"&gt;20.18&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;current:&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;span class="err"&gt;node:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'v&lt;/span&gt;&lt;span class="mf"&gt;18.20&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="err"&gt;'&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;&lt;strong&gt;What if... the warning was actually the error?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# v18.20.8&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I installed Node 20:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;nvm &lt;span class="nb"&gt;install &lt;/span&gt;20
nvm use 20
node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;span class="c"&gt;# v20.18.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then I ran my script one more time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node explorer.mjs TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=== Solana Account Explorer ===


Address:    TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA
Balance:    11.977573357 SOL (11977573357 lamports)
Owner:      BPF Upgradeable Loader (BPFLoaderUpgradeab1e11111111111111111111111)
Executable: true
Data size:  36 bytes
Rent epoch: 18446744073709551615
Data (hex): 0200000027f190b1d3af98b8ce714c44e8cadff9f8fc45cb8e5fac4202eff8110d97dd37
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;IT WORKED.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three days. 72 hours. For a few line script.&lt;/p&gt;

&lt;p&gt;All because I didn't believe the warning.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Happened (The Real Explanation)
&lt;/h2&gt;

&lt;p&gt;Here's what I learned that no tutorial told me:&lt;/p&gt;

&lt;h3&gt;
  
  
  There Are Two Solana JavaScript Libraries
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;Node.js Required&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@solana/web3.js&lt;/code&gt; (v1)&lt;/td&gt;
&lt;td&gt;Node 10+&lt;/td&gt;
&lt;td&gt;Old but stable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;@solana/kit&lt;/code&gt; (v2+)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Node 20+&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New, modern, faster&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I was trying to use the NEW library on an OLD Node version.&lt;/p&gt;

&lt;p&gt;It's like trying to run a PS5 game on a PS4. The disc fits. The box looks similar. But it will never work.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Warning Was Actually The Error
&lt;/h3&gt;

&lt;p&gt;Web2 developers (like me) are trained to ignore warnings. "It's just a warning. Your code will still run."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In Web3, the warning IS the error.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When a Solana package says &lt;code&gt;node: '&amp;gt;=20.18.0'&lt;/code&gt;, it means it. No negotiation. No "probably fine." It requires features that literally don't exist in Node 18.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Fix (In 3 Commands)
&lt;/h2&gt;

&lt;p&gt;If you're reading this because you're stuck where I was, here's what you do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install nvm (Node Version Manager) if you don't have it&lt;/span&gt;
curl &lt;span class="nt"&gt;-o-&lt;/span&gt; https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.0/install.sh | bash

&lt;span class="c"&gt;# 2. Install and use Node 20&lt;/span&gt;
nvm &lt;span class="nb"&gt;install &lt;/span&gt;20
nvm use 20

&lt;span class="c"&gt;# 3. Make sure your package.json has a REAL version&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @solana/kit@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run your script again.&lt;/p&gt;

&lt;p&gt;If it still doesn't work, delete &lt;code&gt;node_modules&lt;/code&gt; and &lt;code&gt;package-lock.json&lt;/code&gt; and reinstall:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; node_modules package-lock.json
npm &lt;span class="nb"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  The Prevention Checklist
&lt;/h2&gt;

&lt;p&gt;Before you write a SINGLE line of Solana code, do this:&lt;/p&gt;

&lt;p&gt;☐ Check your Node version: &lt;code&gt;node --version&lt;/code&gt;&lt;br&gt;
☐ If it's below 20(or the latest node version), upgrade NOW&lt;br&gt;
☐ Install &lt;code&gt;nvm&lt;/code&gt; so you can switch versions easily&lt;br&gt;
☐ Read ALL warnings. They're not suggestions.&lt;br&gt;
☐ Verify your &lt;code&gt;package.json&lt;/code&gt; has real versions (no &lt;code&gt;^0.0.0&lt;/code&gt;)&lt;/p&gt;


&lt;h2&gt;
  
  
  The Working Code (Finally)
&lt;/h2&gt;

&lt;p&gt;Here's my complete Solana account explorer. It's simple. It works. And it will save you three days.&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;address&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@solana/kit&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;RPC_URL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://api.devnet.solana.com&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createSolanaRpc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;RPC_URL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;inputAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;inputAddress&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Usage: node explorer.mjs &amp;lt;SOLANA_ADDRESS&amp;gt;&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;targetAddress&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;address&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;inputAddress&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Get balance&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;balanceLamports&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getBalance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetAddress&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;balanceSol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;balanceLamports&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="nx"&gt;_000_000_000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="c1"&gt;// Get account info&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;accountInfo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;rpc&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAccountInfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;targetAddress&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;encoding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;base64&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;KNOWN_PROGRAMS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;11111111111111111111111111111111&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;System Program&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Token Program&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Token-2022 Program&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;=== Solana Account Explorer ===&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Address:    &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;inputAddress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Balance:    &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;balanceSol&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; SOL`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;accountInfo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Status:     Account not found on-chain`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ownerLabel&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;KNOWN_PROGRAMS&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;accountInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;accountInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;owner&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Owner:      &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;ownerLabel&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Executable: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;accountInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;executable&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Data size:  &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;accountInfo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; bytes`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`\n🔗 Explorer: https://explorer.solana.com/address/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;inputAddress&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;?cluster=devnet`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&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;h2&gt;
  
  
  What I Learned (And What You Should Know)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Web2 Developers Coming to Web3:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Node version matters.&lt;/strong&gt; Like, REALLY matters. Not "recommended." Required.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Read the warnings.&lt;/strong&gt; In Web3, warnings are usually errors in disguise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install nvm TODAY.&lt;/strong&gt; Switching Node versions takes 2 seconds. Not having nvm costs days.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;There are two Solana libraries.&lt;/strong&gt; Know which one you're using and what it needs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Three days of debugging is normal.&lt;/strong&gt; Don't quit. Everyone goes through this.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  The Bottom Line
&lt;/h2&gt;

&lt;p&gt;Your Node.js version WILL break Solana.&lt;/p&gt;

&lt;p&gt;Not "might." Not "sometimes." It will break it.&lt;/p&gt;

&lt;p&gt;But now you know the fix. And it's simpler than you thought:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upgrade to latest Node version.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's it. That's the article.&lt;/p&gt;

&lt;p&gt;(I wish someone had just told me that on Day 1.)&lt;/p&gt;




&lt;h2&gt;
  
  
  Your Turn
&lt;/h2&gt;

&lt;p&gt;Are you doing #100DaysOfSolana? Stuck on a similar error?&lt;/p&gt;

&lt;p&gt;Here's what I need you to do right now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If it doesn't say &lt;code&gt;v20.x.x&lt;/code&gt; or higher, stop everything and upgrade.&lt;/p&gt;

&lt;p&gt;Then come back and build something awesome.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm documenting my entire #100DaysOfSolana journey. Follow along for more hard-earned lessons, debugging stories, and working code.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Questions? Got your own debugging horror story? Drop a comment or find me on [&lt;a href="https://x.com/hxrh__" rel="noopener noreferrer"&gt;https://x.com/hxrh__&lt;/a&gt;].&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Don't hesitate to share this article because it will only cost 4 minutes of reading time and debugging time of 3 days saved. Thank you&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>writing</category>
      <category>web3</category>
      <category>beginners</category>
    </item>
    <item>
      <title>I Got a Green Tick. But What Just Happened?</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Tue, 19 May 2026 20:16:56 +0000</pubDate>
      <link>https://dev.to/hxrh/i-got-a-green-tick-but-what-just-happened-5fbm</link>
      <guid>https://dev.to/hxrh/i-got-a-green-tick-but-what-just-happened-5fbm</guid>
      <description>&lt;p&gt;The first time I got a confirmed transaction on devnet, I felt great for about 10 seconds.&lt;/p&gt;

&lt;p&gt;Then I thought: I have no idea what actually just happened.&lt;/p&gt;

&lt;p&gt;I'd been treating transactions like a black box. Type address, type amount, hit send, done. But that stops working the moment something breaks — or the moment you try to build anything beyond a basic transfer.&lt;/p&gt;

&lt;p&gt;So I went and figured it out. Turns out a Solana transaction is made of four things. Once you see what each one does, a lot of other stuff clicks into place.&lt;/p&gt;




&lt;h2&gt;
  
  
  The four parts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt; — what you want to do&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accounts&lt;/strong&gt; — what data will be touched&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signatures&lt;/strong&gt; — proof of authorization&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recent blockhash&lt;/strong&gt; — a built-in expiry stamp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it. Let's go through them.&lt;/p&gt;




&lt;h2&gt;
  
  
  Instructions
&lt;/h2&gt;

&lt;p&gt;An instruction is the action. It says: &lt;em&gt;call this program, with these inputs.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;For a basic SOL transfer, the instruction calls Solana's System Program — a built-in program that handles things like moving SOL between wallets. You don't deploy it, it's just there.&lt;/p&gt;

&lt;p&gt;The thing that surprised me: &lt;strong&gt;one transaction can hold multiple instructions&lt;/strong&gt;. You could transfer SOL, create an account, and call another program — all in one shot. And it's all-or-nothing. Either every instruction succeeds or the whole transaction fails. No partial results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Accounts
&lt;/h2&gt;

&lt;p&gt;In Solana, almost everything is an account — your wallet, a token balance, a deployed program. The whole network state is basically one giant table where every row has an address and some data.&lt;/p&gt;

&lt;p&gt;When you write an instruction, you have to &lt;strong&gt;declare every account it will touch upfront&lt;/strong&gt; — even ones you're only reading. You also mark each one as writable or read-only, and whether it needs to sign.&lt;/p&gt;

&lt;p&gt;This felt like extra work at first. But the reason is smart: Solana uses that list to figure out which transactions can run in parallel. No shared accounts = no conflict = process them at the same time. It's a big part of why Solana can handle so many transactions per second.&lt;/p&gt;




&lt;h2&gt;
  
  
  The recent blockhash
&lt;/h2&gt;

&lt;p&gt;Every transaction has to include a &lt;strong&gt;recent blockhash&lt;/strong&gt; — a hash of a block that was produced recently on the chain.&lt;/p&gt;

&lt;p&gt;It does two things.&lt;/p&gt;

&lt;p&gt;First, &lt;strong&gt;replay protection&lt;/strong&gt;. Without it, someone could take your signed transaction and submit it again later. The blockhash ties the transaction to a specific moment, so the network rejects anything that references an old one.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;expiry&lt;/strong&gt;. A blockhash is only valid for about 150 blocks — roughly 60 to 90 seconds. After that window, the transaction is dead. You'd need a fresh blockhash and start over.&lt;/p&gt;

&lt;p&gt;This is where Solana diverges from anything in Web2. A database transaction doesn't expire. You can open one, walk away, come back. Solana transactions are more like a signed cheque with an expiry date on it — legitimate signature, but useless after the window closes.&lt;/p&gt;

&lt;p&gt;Practical note: fetch the blockhash as late as possible, right before you send.&lt;/p&gt;




&lt;h2&gt;
  
  
  Signatures
&lt;/h2&gt;

&lt;p&gt;Before a transaction is broadcast, it gets signed with your private key. Validators verify the signature against your public key before running anything.&lt;/p&gt;

&lt;p&gt;If the transaction was tampered with after signing, the signature won't match and it gets rejected.&lt;/p&gt;

&lt;p&gt;Two things worth knowing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transactions can need multiple signatures.&lt;/strong&gt; Some programs require both parties to sign. Multisig setups require a minimum number of co-signers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The signature is the transaction ID.&lt;/strong&gt; That long string in the Explorer URL? That's not a separately generated ID — it's the actual cryptographic signature. Every transaction ID on Solana is its own proof of authorization.&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%2Fb8y87iwg5lz8blo9rjbt.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%2Fb8y87iwg5lz8blo9rjbt.png" alt=" " width="799" height="381"&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%2F8lu1rjfc6odr16x59o1o.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%2F8lu1rjfc6odr16x59o1o.png" alt=" " width="799" height="344"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Go look at one on Explorer
&lt;/h2&gt;

&lt;p&gt;Open any of your devnet transactions on &lt;a href="https://explorer.solana.com/?cluster=devnet" rel="noopener noreferrer"&gt;Solana Explorer&lt;/a&gt;. You'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Account Inputs&lt;/strong&gt; — every account, labeled writable or read-only&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Instructions&lt;/strong&gt; — each one expanded with its program and data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signatures&lt;/strong&gt; — at the bottom of the page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Map what you see back to the four parts above. It lands differently when the transaction on screen is one you sent yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The one thing to take away
&lt;/h2&gt;

&lt;p&gt;A Solana transaction isn't just a request. It's a signed, time-limited, all-or-nothing bundle that declares its own authorization and expiry before it hits the network.&lt;/p&gt;

&lt;p&gt;Once that settled in for me, a lot of things that seemed weird about Solana started making sense.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Part of my &lt;a href="https://dev.to/t/100daysofsolana"&gt;#100DaysOfSolana&lt;/a&gt; journey.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>learning</category>
      <category>writing</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Mon, 18 May 2026 18:57:45 +0000</pubDate>
      <link>https://dev.to/hxrh/-5351</link>
      <guid>https://dev.to/hxrh/-5351</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/syedahmershah/how-ai-is-revolutionizing-the-coding-workforce-in-2025-52e8" class="crayons-story__hidden-navigation-link"&gt;How AI is Revolutionizing the Coding Workforce in 2025&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/syedahmershah" class="crayons-avatar  crayons-avatar--l  "&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%2Fuser%2Fprofile_image%2F3021645%2Fad95c369-a218-4eb1-9eca-5f628e887906.png" alt="syedahmershah profile" class="crayons-avatar__image" width="800" height="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/syedahmershah" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Syed Ahmer Shah
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Syed Ahmer Shah
                
              
              &lt;div id="story-author-preview-content-2492820" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/syedahmershah" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2Fuser%2Fprofile_image%2F3021645%2Fad95c369-a218-4eb1-9eca-5f628e887906.png" class="crayons-avatar__image" alt="" width="800" height="800"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Syed Ahmer Shah&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/syedahmershah/how-ai-is-revolutionizing-the-coding-workforce-in-2025-52e8" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 16 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/syedahmershah/how-ai-is-revolutionizing-the-coding-workforce-in-2025-52e8" id="article-link-2492820"&gt;
          How AI is Revolutionizing the Coding Workforce in 2025
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ahmershah"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ahmershah&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ahmershahdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ahmershahdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/syedahmershah/how-ai-is-revolutionizing-the-coding-workforce-in-2025-52e8" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;323&lt;span class="hidden s:inline"&gt;&amp;nbsp;reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/syedahmershah/how-ai-is-revolutionizing-the-coding-workforce-in-2025-52e8#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>From CLI Commands to My First Solana Transfer Tool</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Sat, 16 May 2026 21:47:51 +0000</pubDate>
      <link>https://dev.to/hxrh/from-cli-commands-to-my-first-solana-transfer-tool-2keh</link>
      <guid>https://dev.to/hxrh/from-cli-commands-to-my-first-solana-transfer-tool-2keh</guid>
      <description>&lt;p&gt;By this point in the #100DaysOfSolana course, I had already explored a few different aspects of Solana, not just the CLI. But when I first started experimenting, I was mainly running one‑off CLI commands on devnet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana transfer &amp;lt;recipient&amp;gt; &amp;lt;amount&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It worked, but it felt awkward. Each time I wanted to send SOL I had to type in the recipient and the amount again, with no balance checks or helpful feedback — just bare commands.&lt;/p&gt;

&lt;p&gt;On Day 17, the course pushed me to go further: instead of repeating raw CLI commands, I built my own Node.js script. Now I can run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;node transfer.mjs &amp;lt;recipient&amp;gt; 0.05
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The recipient and amount are passed in as arguments, and the script handles the rest — checking balances, sending the transaction, and even giving me a link to Solana Explorer. That was the moment things started to click. I wasn’t just typing commands anymore, I was building a tool I could reuse.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Struggle
&lt;/h3&gt;

&lt;p&gt;At first, I thought it would be straightforward. But I quickly ran into issues:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node v12 didn’t support modern syntax like &lt;code&gt;??&lt;/code&gt; and &lt;code&gt;?.&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Even after upgrading, I hit the dreaded error:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  Transfer failed: No random values implementation could be found.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Debugging felt endless. I was learning Web3 concepts while also fighting with Web2 runtime quirks.
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  The Breakthrough
&lt;/h3&gt;

&lt;p&gt;The breakthrough came when I realized the Solana kit I was using expected browser‑like APIs. Node didn’t expose them globally. So I patched my environment:&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;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;webcrypto&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;node:crypto&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;globalThis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;webcrypto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Polyfill CustomEvent for Node.js &amp;lt; 18.7&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;typeof&lt;/span&gt; &lt;span class="nx"&gt;CustomEvent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;undefined&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;globalThis&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CustomEvent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CustomEvent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Event&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;detail&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&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;Suddenly, the randomness error disappeared. My script connected, checked balances, built transactions, and confirmed them with a link to Solana Explorer.  &lt;/p&gt;




&lt;h3&gt;
  
  
  The Result
&lt;/h3&gt;

&lt;p&gt;Now I have a reusable CLI transfer tool that:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Accepts recipient + amount as arguments
&lt;/li&gt;
&lt;li&gt;Checks my balance before sending
&lt;/li&gt;
&lt;li&gt;Reports the result with a signature and Explorer link
&lt;/li&gt;
&lt;li&gt;Shows my updated balance after the transfer
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What started as a one‑off CLI experiment became a proper utility — something I can reuse, extend, and share.  &lt;/p&gt;




&lt;h3&gt;
  
  
  My Takeaway
&lt;/h3&gt;

&lt;p&gt;Web3 isn’t magic. It’s just APIs, runtimes, and debugging like any other stack. The difference is that every bug you fix teaches you something deeper about how blockchains work.  &lt;/p&gt;

&lt;p&gt;If you’re a web or mobile developer curious about Solana, start small. Wrap a CLI command in code. Debug the errors. Before you know it, you’ll have built your own tool — and you’ll understand Solana a lot better.  &lt;/p&gt;

&lt;p&gt;I went from typing raw commands to building my first Solana transfer tool. And the best part? It feels like the beginning of something bigger.  &lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>learning</category>
    </item>
    <item>
      <title>My Solana Journey: Week Two</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Mon, 11 May 2026 19:45:06 +0000</pubDate>
      <link>https://dev.to/hxrh/my-solana-journey-week-two-47eb</link>
      <guid>https://dev.to/hxrh/my-solana-journey-week-two-47eb</guid>
      <description>&lt;p&gt;When I first started exploring Solana, I wasn’t sure what blockchain data would look like. I imagined something abstract and hidden away, but the reality was surprisingly transparent. Every time someone sends SOL, creates a token, or interacts with a program, it’s recorded as a transaction that anyone can look up. Seeing that history unfold in Solana Explorer made the “public database” idea click in a very real way. It’s both fascinating and a little intimidating to realize how open the system is.&lt;/p&gt;

&lt;p&gt;One of the biggest breakthroughs for me was understanding what a signature and a slot mean. At first, those terms felt cryptic, but once I connected them to how transactions are verified and ordered, it started to make sense. That moment of clarity was exciting—it felt like peeling back a layer of mystery.&lt;/p&gt;

&lt;p&gt;Another surprise was realizing that every wallet on Solana is actually an account. That framing helped me see the network less like a collection of disconnected addresses and more like a structured system where each account has its own state and history.&lt;/p&gt;

&lt;p&gt;That said, I’m still figuring out what exactly a transaction entails beyond just “sending SOL.” I’ve interacted with Solana Explorer, but I want to dive deeper into how program interactions are represented and what all the fields mean. There’s a lot of detail in the RPC responses that I haven’t fully decoded yet.&lt;/p&gt;

&lt;p&gt;What’s next for me? I want to learn more about reading on-chain data programmatically and compare it to working with traditional APIs. I suspect the differences will be eye-opening, especially around how state is managed and queried.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Identity on Blockchain: How It Differs from the Traditional Web (with a Focus on Solana)</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Fri, 01 May 2026 20:30:22 +0000</pubDate>
      <link>https://dev.to/hxrh/identity-on-blockchain-how-it-differs-from-the-traditional-web-with-a-focus-on-solana-4640</link>
      <guid>https://dev.to/hxrh/identity-on-blockchain-how-it-differs-from-the-traditional-web-with-a-focus-on-solana-4640</guid>
      <description>&lt;p&gt;Over the past week, I started learning about blockchain, and one of the first concepts I encountered was identity. In our everyday lives, identity is the way we prove who we are. Governments issue ID cards with photos and biometrics, banks assign account numbers with passwords, and online platforms like Google or Facebook give us usernames and passwords to access services. These are all forms of identity, but they rely on centralized authorities—institutions that validate and store our information.&lt;/p&gt;

&lt;p&gt;On the internet, identity is often tied to accounts managed by large corporations. A Google account, for example, lets you sign in to countless applications, but Google ultimately controls that identity. If they revoke access, you lose it. This model works, but it raises questions about privacy, ownership, and control. Blockchain networks, however, introduce a fundamentally different way of thinking about identity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How Identity Works in Blockchain&lt;/strong&gt;&lt;br&gt;
At its core, blockchain identity is based on cryptography. Instead of usernames and passwords stored by a company, blockchain identity is defined by a keypair: a public key and a private key.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Public Key:&lt;/strong&gt; This is like your address. On Solana, it’s a long string of characters that uniquely identifies you on the network. Anyone can see it, and it’s used to receive tokens, interact with smart contracts, or participate in decentralized applications (dApps).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private Key:&lt;/strong&gt; This is your secret. It proves ownership of the public key and allows you to sign transactions. If someone else gains access to your private key, they effectively become you on the blockchain.&lt;/p&gt;

&lt;p&gt;This system is similar to having a bank account number (public key) and a PIN (private key), but with one crucial difference: no central authority issues or controls these keys. You generate them yourself, and ownership is entirely in your hands.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Blockchain Identity Is Different&lt;/strong&gt;&lt;br&gt;
The difference between blockchain identity and traditional web identity lies in decentralization and self-sovereignty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ownership:&lt;/strong&gt; On the traditional web, your identity is managed by platforms. On blockchain, you own your identity outright. Your keys are generated locally, and no one can revoke them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Portability:&lt;/strong&gt; A Google account works across Google services, but not outside them. A blockchain identity, however, is portable across the entire network. On Solana, the same public key can interact with hundreds of dApps, from decentralized finance (DeFi) platforms to NFT marketplaces, without needing separate logins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trustless Verification:&lt;/strong&gt; Traditional identity requires trust in institutions. Blockchain identity relies on cryptographic proof. When you sign a transaction with your private key, the network can mathematically verify it without needing to “trust” a third party.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Privacy:&lt;/strong&gt; On the web, accounts are tied to personal information—emails, phone numbers, sometimes even government IDs. On blockchain, your identity is pseudonymous. Your public key doesn’t reveal your name or personal details unless you choose to link them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Identity on Solana&lt;/strong&gt;&lt;br&gt;
Solana, a high-performance blockchain, takes these principles and applies them at scale. Because Solana is designed for speed and low transaction costs, identity on Solana is not just secure but also highly practical.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Wallets as Identity&lt;/em&gt;: On Solana, your identity is represented by your wallet. Popular wallets like Phantom or Solflare generate and manage your keypair. When you connect your wallet to a dApp, you’re proving your identity by signing with your private key.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Single Sign-On for Web3&lt;/em&gt;: Instead of creating accounts with usernames and passwords, Solana users simply connect their wallet. This acts as a universal login across the ecosystem. It’s like having one identity that works everywhere, but without a corporation in control.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Programmable Identity&lt;/em&gt;: Solana’s smart contracts allow developers to build applications that recognize and interact with identities directly. For example, an NFT marketplace can verify ownership of digital assets tied to your public key, or a DeFi protocol can grant access to services based on your wallet’s activity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Identity on blockchain, and specifically on Solana, represents a shift from centralized control to self-sovereignty. Instead of relying on corporations or governments to define who you are online, you generate and own your identity through cryptographic keys. This identity is portable, secure, and verifiable across the entire Solana ecosystem.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>beginners</category>
    </item>
    <item>
      <title>An Overview of Wallets on the Solana Network and Their Use Cases</title>
      <dc:creator>Hauwa Ibrahim</dc:creator>
      <pubDate>Mon, 27 Apr 2026 21:46:23 +0000</pubDate>
      <link>https://dev.to/hxrh/an-overview-of-wallets-on-the-solana-network-and-their-use-cases-22kl</link>
      <guid>https://dev.to/hxrh/an-overview-of-wallets-on-the-solana-network-and-their-use-cases-22kl</guid>
      <description>&lt;p&gt;Day 5 of #100daysofsolana&lt;/p&gt;

&lt;p&gt;Wallet are a means of authenticating an identity on blockchain apart from their other use of storing funds in them. It can be comparable to a google account which we use to sign in/up on different platforms on the internet&lt;/p&gt;

&lt;p&gt;Over the past days I learnt about solana wallets and some of their types which includes - CLI wallets, Wallet extensions, mobile wallet.&lt;/p&gt;

&lt;p&gt;CLI wallet: This is a wallet created on a computer terminal . &lt;br&gt;
When is it used?&lt;br&gt;
 This is usually used in development  i.e when writing script and testing a program&lt;br&gt;
 It has a shortfall, the private key is stored in a file on a computer which can be read by anyone who has access to the computer. Real money can't be stored in it.&lt;/p&gt;

&lt;p&gt;Browser extension wallet: This encrypt private keys, add password layer to prevent unaauthorized access, approves or disapprove transactions whenever a site requests of it. This is safer than CLI wallet and allows for interaction with decentralised applications(dApps)&lt;/p&gt;

&lt;p&gt;Mobile wallet: This has an additional layer of protection, it supports biometrics authentication(FaceId and fingerprint) alongside password. Real money can be stored on it.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>web3</category>
      <category>100daysofsolana</category>
    </item>
  </channel>
</rss>
