<?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: Samuel Akoji</title>
    <description>The latest articles on DEV Community by Samuel Akoji (@sammie_).</description>
    <link>https://dev.to/sammie_</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%2F3898087%2F3cb96184-ed6c-4759-9563-1bdb59d178c2.jpg</url>
      <title>DEV Community: Samuel Akoji</title>
      <link>https://dev.to/sammie_</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sammie_"/>
    <language>en</language>
    <item>
      <title>From npm install to Soulbound Tokens: My First 5 Days Building on Solana</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Tue, 26 May 2026 10:57:02 +0000</pubDate>
      <link>https://dev.to/sammie_/from-npm-install-to-soulbound-tokens-my-first-5-days-building-on-solana-5a2</link>
      <guid>https://dev.to/sammie_/from-npm-install-to-soulbound-tokens-my-first-5-days-building-on-solana-5a2</guid>
      <description>&lt;p&gt;Solana's token system is nothing like what I expected coming from Web2 frontend dev. Here's everything I learned in 5 days from minting my first token to locking one so it can never move again.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context: where I started
&lt;/h2&gt;

&lt;p&gt;I came in with a Computer Science background, decent TypeScript skills, and a strong understanding of crypto from years of community building and education in Nigeria. But writing blockchain logic? That was new territory.&lt;/p&gt;

&lt;p&gt;My goal was simple: understand how tokens actually work on Solana at the code level, not just the concept level. I started on Day 29 with a blank terminal and one mission mint something.&lt;/p&gt;

&lt;h2&gt;
  
  
  The walkthrough
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Day 29–30 First mint with the Token Extensions Program
&lt;/h3&gt;

&lt;p&gt;The first decision was which program to use. Solana has two: the original &lt;a href="https://solana.com/docs/tokens/basics" rel="noopener noreferrer"&gt;SPL Token Program&lt;/a&gt; and the newer &lt;a href="https://solana.com/docs/tokens/extensions" rel="noopener noreferrer"&gt;Token Extensions Program&lt;/a&gt; (also called Token-2022). I chose Token Extensions from the start because it supports advanced features transfer fees, metadata, and non-transferable tokens without needing a separate program.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&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;createMint&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/spl-token&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;mint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createMint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// fee payer keypair&lt;/span&gt;
  &lt;span class="nx"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// mint authority&lt;/span&gt;
  &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// freeze authority&lt;/span&gt;
  &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;               &lt;span class="c1"&gt;// decimals&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;TOKEN_2022_PROGRAM_ID&lt;/span&gt; &lt;span class="c1"&gt;// this is what makes it Token Extensions&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;TOKEN_2022_PROGRAM_ID&lt;/code&gt; at the end is everything. Without it, you're on the original program and lose access to extensions entirely.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 31 Transfer fees and why they exist
&lt;/h3&gt;

&lt;p&gt;Transfer fees let a token creator take a percentage of every transfer. The implementation is more nuanced than you'd expect fees are &lt;em&gt;withheld&lt;/em&gt; on destination accounts, not auto-transferred. You have to harvest them manually.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;createInitializeTransferFeeConfigInstruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;transferFeeConfigAuthority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;withdrawWithheldAuthority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;          &lt;span class="c1"&gt;// 1% (basis points — so 100 = 1%)&lt;/span&gt;
  &lt;span class="nc"&gt;BigInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;// max fee cap in token units&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What surprised me:&lt;/strong&gt; The fee is withheld on the &lt;em&gt;recipient's&lt;/em&gt; account, not deducted before transfer. The sender sends the full amount, the recipient gets slightly less, and the creator must run a separate harvest instruction to collect. Very different from how payment fees work in Web2.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Day 32 Metadata directly on the token
&lt;/h3&gt;

&lt;p&gt;With the original Token Program, metadata lives on a separate Metaplex account. Token Extensions lets you attach it directly to the mint name, symbol, URI, and custom key-value fields.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;tokenMetadataInitialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;updateAuthority&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;mint&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="c1"&gt;// mint authority signs&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MyToken&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;// name&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MTK&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;           &lt;span class="c1"&gt;// symbol&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="c1"&gt;// URI pointing to JSON metadata&lt;/span&gt;
  &lt;span class="nx"&gt;TOKEN_2022_PROGRAM_ID&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can call &lt;code&gt;tokenMetadataUpdateField&lt;/code&gt; later to add arbitrary key-value pairs useful for attaching on-chain properties to a token after the fact.&lt;/p&gt;

&lt;h3&gt;
  
  
  Day 33 Non-transferable (soulbound) tokens
&lt;/h3&gt;

&lt;p&gt;This was my favourite session. A non-transferable token can be minted but never moved. Once it's in a wallet, it stays there. The extension enforces this at the program level not through off-chain rules that can be bypassed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;extensions&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ExtensionType&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NonTransferable&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;mintLen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;getMintLen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;extensions&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;createAccountIx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;SystemProgram&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createAccount&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;fromPubkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;payer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;newAccountPubkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mintKeypair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;space&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;mintLen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;lamports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getMinimumBalanceForRentExemption&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;mintLen&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;programId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;TOKEN_2022_PROGRAM_ID&lt;/span&gt;&lt;span class="p"&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;initNonTransferableIx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;
  &lt;span class="nf"&gt;createInitializeNonTransferableMintInstruction&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;mintKeypair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;publicKey&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;TOKEN_2022_PROGRAM_ID&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use cases: event credentials, certificates, loyalty status, proof of participation anything where you want on-chain proof of something that shouldn't be sold or transferred.&lt;/p&gt;

&lt;h2&gt;
  
  
  What surprised me
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Extension initialization order matters.&lt;/strong&gt; Extensions must be initialized in a specific sequence during mint creation. Getting it wrong produces cryptic transaction errors. The docs mention it, but it doesn't really land until you see the failure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rent-exemption is a real upfront cost.&lt;/strong&gt; Every account on Solana must hold enough SOL to be rent-exempt. The more extensions you add, the larger the account, and the more lamports you need. You can't stack five extensions and expect the same fee as one account for this in any production setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Interest-bearing tokens: tokens that accrue value over time, entirely on-chain&lt;/li&gt;
&lt;li&gt;Permanent delegate extension: assigning an authority that can always move tokens regardless of owner&lt;/li&gt;
&lt;li&gt;Building a frontend UI to interact with these programs&lt;/li&gt;
&lt;li&gt;Exploring real-world use cases for communities across Africa: event credentials, loyalty tokens, proof-of-participation badges&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're also learning Solana or building in the African Web3 space, drop a comment or follow along. Building in public, one day at a time.&lt;/p&gt;

</description>
      <category>solana</category>
      <category>blockchain</category>
      <category>webdev</category>
      <category>100daysofsolana</category>
    </item>
    <item>
      <title>Solana Stores Bytes, Not JSON. Here's What That Actually Means</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Sat, 23 May 2026 22:17:18 +0000</pubDate>
      <link>https://dev.to/sammie_/solana-stores-bytes-not-json-heres-what-that-actually-means-3875</link>
      <guid>https://dev.to/sammie_/solana-stores-bytes-not-json-heres-what-that-actually-means-3875</guid>
      <description>&lt;p&gt;I spent weeks reading Solana accounts through explorers and RPC calls, seeing nicely formatted data token balances, authorities, supply numbers and thinking that's what Solana stored.&lt;/p&gt;

&lt;p&gt;It isn't. Solana stores raw bytes.&lt;/p&gt;

&lt;p&gt;Day 24 of #100DaysOfSolana made this uncomfortably real.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Moment It Clicked
&lt;/h2&gt;

&lt;p&gt;The challenge was to fetch the Wrapped SOL mint account from mainnet and decode it three different ways: using an SPL Token decoder, manually byte by byte, and via the RPC's &lt;code&gt;jsonParsed&lt;/code&gt; output.&lt;/p&gt;

&lt;p&gt;When I fetched the raw account data it looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;82 bytes of nothing, apparently. No field names. No labels. Just numbers.&lt;/p&gt;

&lt;p&gt;But here's the thing those 82 bytes contain everything: the total supply of Wrapped SOL, the number of decimals, the mint authority, the freeze authority, and whether the mint has been initialized. All of it, packed tightly into a flat array.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Programs Know What the Bytes Mean
&lt;/h2&gt;

&lt;p&gt;This is the key insight: &lt;strong&gt;the program that owns an account defines what its bytes mean.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Token Program knows that bytes 0–3 are a discriminator, bytes 4–35 are the mint authority option, bytes 36–43 are the supply, byte 44 is the decimal count, and so on. It's essentially a binary schema baked into the program's code.&lt;/p&gt;

&lt;p&gt;When you decode the account three ways with the SPL codec, manually, and via &lt;code&gt;jsonParsed&lt;/code&gt;all three produce the same output:&lt;/p&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
json
{
  "mintAuthority": null,
  "supply": "0",
  "decimals": 9,
  "isInitialized": true,
  "freezeAuthority": null
}
Three approaches. One truth. The bytes were the truth all along.
Why This Changes How You Think About On-Chain Data
Solana explorers are doing you a favour you don't see. Every time you open explorer.solana.com and see a nicely formatted token account, the explorer is decoding those raw bytes using the program's known schema and presenting the result as readable JSON.
If you're building your own indexer, your own program, or your own tooling you don't get that favour for free. You need to know the schema. You need to decode the bytes yourself.
This is why Solana programs publish IDLs (Interface Definition Languages) so that clients know how to decode the data their program writes. Without an IDL, you're reading tea leaves.
The Bigger Picture
In Web2, your database stores typed fields. VARCHAR, BIGINT, BOOLEAN the database engine enforces types, and your ORM maps them to objects automatically.
On Solana, the "database" is just bytes. The "ORM" is the program's codec. The "schema" is whatever the program's developers decided and (hopefully) documented.
That's a lot more power and a lot more responsibility.
Raw bytes go in. Structured data comes out. Understanding what's in between is what separates someone who uses Solana from someone who understands it.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>learning</category>
      <category>solana</category>
    </item>
    <item>
      <title>Solana's System Program Accounts: A Developer's Hands-On Inspection Guide</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Fri, 22 May 2026 22:00:00 +0000</pubDate>
      <link>https://dev.to/sammie_/solanas-system-program-accounts-a-developers-hands-on-inspection-guide-64i</link>
      <guid>https://dev.to/sammie_/solanas-system-program-accounts-a-developers-hands-on-inspection-guide-64i</guid>
      <description>&lt;h2&gt;
  
  
  Everything Is an Account Let's Prove It
&lt;/h2&gt;

&lt;p&gt;One of the first things you hear about Solana is "everything is an account." It sounds like marketing. Day 25 of 100 Days of Solana makes it concrete: you open the CLI, inspect real accounts your wallet, the System Program, native programs, sysvar accounts and see that the claim is literally true.&lt;/p&gt;

&lt;p&gt;This is a hands-on walkthrough of exactly what to run and what you'll find.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Inspect Your Own Wallet
&lt;/h2&gt;

&lt;p&gt;Start with what you know:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account &amp;lt;YOUR_WALLET_ADDRESS&amp;gt; &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Public Key: &lt;br&gt;
Balance: 1.247 SOL&lt;br&gt;
Owner: 11111111111111111111111111111111&lt;br&gt;
Executable: false&lt;br&gt;
Rent Epoch: 0&lt;/p&gt;

&lt;p&gt;Four fields. This is the raw account model for a wallet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; &lt;code&gt;11111111111111111111111111111111&lt;/code&gt; the System Program. Every regular wallet is owned by it. This is why only the System Program can process SOL transfers from your wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executable:&lt;/strong&gt; false your wallet is data, not code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data:&lt;/strong&gt; empty wallets store no extra data, just the SOL balance tracked in lamports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rent Epoch:&lt;/strong&gt; 0 means rent-exempt. Funded above the minimum threshold.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 2: Inspect the System Program
&lt;/h2&gt;

&lt;p&gt;Now inspect the program that owns your wallet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account 11111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Public Key: 11111111111111111111111111111111&lt;br&gt;
Balance: 1 SOL&lt;br&gt;
Owner: NativeLoader1111111111111111111111111111111&lt;br&gt;
Executable: true&lt;br&gt;
Data Length: 14 bytes&lt;/p&gt;

&lt;p&gt;Key differences from your wallet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Executable: true&lt;/strong&gt; this is a program, not a data account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner: NativeLoader&lt;/strong&gt; native programs are loaded by the validator itself, not deployed via the BPF loader&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data Length: 14 bytes&lt;/strong&gt; almost nothing. Native program code lives in the validator binary, not in account data. The account is essentially a pointer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Same four fields as your wallet. One boolean flipped. That's the entire difference between "wallet" and "program" in Solana's account model.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Inspect the BPF Loader
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account BPFLoaderUpgradeab1e11111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Output:&lt;br&gt;
Executable: true&lt;br&gt;
Owner: NativeLoader1111111111111111111111111111111&lt;br&gt;
Data Length: 36 bytes&lt;/p&gt;

&lt;p&gt;The BPF Loader is the program that deploys and manages all user-written programs on Solana. When you deploy a program with &lt;code&gt;solana program deploy&lt;/code&gt;, you're invoking the BPF Loader. This is the runtime stack made visible: NativeLoader owns the BPF Loader, which owns your programs.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Inspect Sysvar Accounts
&lt;/h2&gt;

&lt;p&gt;Sysvar accounts are read-only accounts the network maintains with live runtime data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clock sysvar&lt;/strong&gt; current slot, epoch, and timestamp:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account SysvarC1ock11111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Rent sysvar&lt;/strong&gt; the current rent rate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account SysvarRent111111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Recent Blockhashes sysvar:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account SysvarRecentB1ockHashes11111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All of these are just accounts same four fields, different data payloads. What makes them special is that the network writes to them every slot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Compare All Four
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account&lt;/th&gt;
&lt;th&gt;Owner&lt;/th&gt;
&lt;th&gt;Executable&lt;/th&gt;
&lt;th&gt;Data&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Your wallet&lt;/td&gt;
&lt;td&gt;System Program&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;empty&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;System Program&lt;/td&gt;
&lt;td&gt;NativeLoader&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;14 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BPF Loader&lt;/td&gt;
&lt;td&gt;NativeLoader&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;36 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Clock sysvar&lt;/td&gt;
&lt;td&gt;Sysvar program&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;40 bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every row uses the same four fields. There is no special "wallet type" or "program type" in Solana's runtime just accounts with different owners, executability flags, and data payloads.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Teaches You
&lt;/h2&gt;

&lt;p&gt;The System Program is the foundation of everything you've done in the first 25 days:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Day 1:&lt;/strong&gt; Airdrop → System Program created your wallet account&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 15–17:&lt;/strong&gt; SOL transfers → System Program executed every one&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Days 22–24:&lt;/strong&gt; Account inspection → you were reading accounts the System Program owns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time you sent SOL, created a wallet, or funded a new account, the System Program was running the instruction. Day 25 just makes it visible.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>learning</category>
      <category>solana</category>
    </item>
    <item>
      <title>I Inspected the System Program and It Looked Just Like My Wallet</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Fri, 22 May 2026 20:23:03 +0000</pubDate>
      <link>https://dev.to/sammie_/i-inspected-the-system-program-and-it-looked-just-like-my-wallet-16b9</link>
      <guid>https://dev.to/sammie_/i-inspected-the-system-program-and-it-looked-just-like-my-wallet-16b9</guid>
      <description>&lt;h2&gt;
  
  
  The Challenge
&lt;/h2&gt;

&lt;p&gt;Day 25 of 100 Days of Solana: inspect system program accounts. Your wallet, the System Program, native programs, sysvar accounts. Use the CLI and Explorer. Understand how they differ and how they're the same.&lt;/p&gt;

&lt;p&gt;I'd been hearing "everything is an account" for 25 days. This was the day I actually verified it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Starting With My Wallet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account &amp;lt;MY_ADDRESS&amp;gt; &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Balance: 1.247 SOL&lt;br&gt;
Owner: 11111111111111111111111111111111&lt;br&gt;
Executable: false&lt;br&gt;
Rent Epoch: 0&lt;/p&gt;

&lt;p&gt;The owner field jumped out: &lt;code&gt;11111111111111111111111111111111&lt;/code&gt;. The System Program. My wallet isn't a special type of thing — it's an account that the System Program owns and manages. Every SOL transfer I've ever made was the System Program modifying this row.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inspecting the System Program Itself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account 11111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Balance: 1 SOL&lt;br&gt;
Owner: NativeLoader1111111111111111111111111111111&lt;br&gt;
Executable: true&lt;br&gt;
Data Length: 14 bytes&lt;/p&gt;

&lt;p&gt;The System Program the program that underlies every wallet on Solana, that has processed billions of transactions is an account with 14 bytes of data and a 1 SOL balance. The &lt;code&gt;executable: true&lt;/code&gt; flag is the only thing that distinguishes it from my wallet structurally. Same schema. One boolean different.&lt;/p&gt;

&lt;p&gt;The 14 bytes confused me at first. After some digging: native programs have their code compiled directly into the validator binary. The account is essentially a registry entry a marker that says "this address is the System Program."&lt;/p&gt;

&lt;h2&gt;
  
  
  The BPF Loader
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account BPFLoaderUpgradeab1e11111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executable: true&lt;br&gt;
Owner: NativeLoader&lt;br&gt;
Data Length: 36 bytes&lt;/p&gt;

&lt;p&gt;The ownership chain: NativeLoader → BPF Loader → my future programs. Three levels, all expressed as account ownership fields.&lt;/p&gt;

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



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account SysvarC1ock11111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Clock sysvar holds the current slot, epoch, and unix timestamp. Updated every slot by the runtime. Programs that need time-based logic read this account.&lt;/p&gt;

&lt;p&gt;What surprised me: it's just an account. &lt;code&gt;executable: false&lt;/code&gt;, owned by the Sysvar program, 40 bytes of encoded data. The same structure as everything else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Mental Model I Built
&lt;/h2&gt;

&lt;p&gt;Every account sits on a spectrum from "pure data" to "pure code," determined entirely by two fields:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;executable&lt;/code&gt; is this account code or data?&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;owner&lt;/code&gt; which program has authority over this account?&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Account type&lt;/th&gt;
&lt;th&gt;executable&lt;/th&gt;
&lt;th&gt;owner&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Wallets&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;System Program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Regular programs&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;BPF Loader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native programs&lt;/td&gt;
&lt;td&gt;true&lt;/td&gt;
&lt;td&gt;NativeLoader&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sysvar accounts&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;Sysvar program&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Your data accounts&lt;/td&gt;
&lt;td&gt;false&lt;/td&gt;
&lt;td&gt;your program&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No special types. No separate registries. One table, differentiated entirely by field values.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CLI Commands Worth Bookmarking
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;solana account 11111111111111111111111111111111              &lt;span class="c"&gt;# System Program&lt;/span&gt;
solana account BPFLoaderUpgradeab1e11111111111111111111111  &lt;span class="c"&gt;# BPF Loader&lt;/span&gt;
solana account SysvarC1ock11111111111111111111111111111111  &lt;span class="c"&gt;# Clock sysvar&lt;/span&gt;
solana account SysvarRent111111111111111111111111111111111  &lt;span class="c"&gt;# Rent sysvar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. Any account. The entire network is readable.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>learning</category>
    </item>
    <item>
      <title>SPL Tokens Explained: Mints, Token Accounts, and Why Solana Separates Them</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Thu, 21 May 2026 21:56:58 +0000</pubDate>
      <link>https://dev.to/sammie_/spl-tokens-explained-mints-token-accounts-and-why-solana-separates-them-fkf</link>
      <guid>https://dev.to/sammie_/spl-tokens-explained-mints-token-accounts-and-why-solana-separates-them-fkf</guid>
      <description>&lt;h2&gt;
  
  
  The Question Everyone Asks
&lt;/h2&gt;

&lt;p&gt;When developers first create a token on Solana, they run into an immediate source of confusion: why are there two addresses? You create a token and get one address. You create an account to hold that token and get a second address. What's going on?&lt;/p&gt;

&lt;p&gt;The answer is one of Solana's most elegant design decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Core Concepts: Mint vs Token Account
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Mint Account&lt;/strong&gt; the token's definition. Stores total supply, decimal places, mint authority (who can create more), and freeze authority. There is exactly one mint account per token type. The mint address is the token's identity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Token Account&lt;/strong&gt; where your balance lives. Owned by the Token Program, stores which mint it belongs to, which wallet owns it, and the current balance. Every wallet that holds a token has its own token account for that token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Are They Separated?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Reason 1: The Token Program needs to own the data&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On Solana, only the owner program of an account can modify that account's data. Token balances live in accounts owned by the Token Program which means only the Token Program can modify them. If balances lived in wallet accounts (owned by the System Program), the Token Program would have no authority over them.&lt;/p&gt;

&lt;p&gt;The separation is a direct consequence of Solana's ownership model: to control data, you must own the account that stores it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason 2: One program, many tokens&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Token Program manages every SPL token USDC, USDT, every project token, every NFT. It can do this because each token's mint and each wallet's token accounts are separate accounts. All SPL tokens share the same program code, making it more efficient and auditable than Ethereum's model where each ERC-20 is a separate contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reason 3: Parallelism&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because each wallet's token balance is in its own account, transfers between different wallets can be processed simultaneously. This contributes to Solana's throughput.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Associated Token Account
&lt;/h2&gt;

&lt;p&gt;Given a wallet address and a mint address, there's a standard formula to compute the canonical token account address:&lt;/p&gt;

&lt;p&gt;ATA address = PDA(wallet_address, token_program_id, mint_address)&lt;/p&gt;

&lt;p&gt;This means any program can calculate where a wallet's balance should be without looking it up. Wallets and apps all agree on one canonical account per token per wallet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Full Lifecycle
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Create the mint&lt;/span&gt;
spl-token create-token
&lt;span class="c"&gt;# → MINT_ADDRESS, supply: 0&lt;/span&gt;

&lt;span class="c"&gt;# 2. Create your token account&lt;/span&gt;
spl-token create-account MINT_ADDRESS
&lt;span class="c"&gt;# → TOKEN_ACCOUNT_ADDRESS, balance: 0&lt;/span&gt;

&lt;span class="c"&gt;# 3. Mint supply&lt;/span&gt;
spl-token mint MINT_ADDRESS 100
&lt;span class="c"&gt;# → supply: 100, your balance: 100&lt;/span&gt;

&lt;span class="c"&gt;# 4. Transfer&lt;/span&gt;
spl-token transfer MINT_ADDRESS 10 RECIPIENT_WALLET
&lt;span class="c"&gt;# → your balance: 90, recipient balance: 10&lt;/span&gt;

&lt;span class="c"&gt;# 5. Burn&lt;/span&gt;
spl-token burn TOKEN_ACCOUNT MINT_ADDRESS 50
&lt;span class="c"&gt;# → your balance: 40, total supply: 50&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What This Looks Like in Explorer
&lt;/h2&gt;

&lt;p&gt;Look up your mint address in explorer.solana.com (devnet) you'll see supply and mint authority decoded. Look up your token account you'll see mint, owner wallet, and balance. Two accounts. One token system. The Token Program is the invisible enforcer between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;The mint + token account model is the foundation of everything in Epoch 2. Metadata, transfer fees, freeze authority, NFTs all of it builds on this same two-account primitive. Understanding why they're separated is the foundation for everything that follows.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>learning</category>
      <category>solana</category>
    </item>
    <item>
      <title>I Used Solana Explorer Like Chrome DevTools Here's What I Found</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Thu, 21 May 2026 16:28:34 +0000</pubDate>
      <link>https://dev.to/sammie_/i-used-solana-explorer-like-chrome-devtools-heres-what-i-found-14ki</link>
      <guid>https://dev.to/sammie_/i-used-solana-explorer-like-chrome-devtools-heres-what-i-found-14ki</guid>
      <description>&lt;h2&gt;
  
  
  DevTools for the Blockchain
&lt;/h2&gt;

&lt;p&gt;Every Web2 developer has a relationship with Chrome DevTools. You open it without thinking. Network tab to check API calls, Console to catch errors, Application tab to inspect localStorage. It's the lens you use to see what your app is actually doing.&lt;/p&gt;

&lt;p&gt;Day 28 of 100 Days of Solana sent me to Solana Explorer with the same mindset: just look at the chain. No task, no script. Just explore.&lt;/p&gt;

&lt;p&gt;Here's what I found when I treated Explorer like DevTools and what each discovery maps to in Web2 terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explorer used:&lt;/strong&gt; explorer.solana.com Devnet, then Mainnet&lt;/p&gt;

&lt;h2&gt;
  
  
  The Network Tab: My Transaction History
&lt;/h2&gt;

&lt;p&gt;My wallet's transaction history in Explorer is every "request" my wallet has sent to the blockchain since Day 1. 27 transactions, chronological. Each shows which program was called, whether it succeeded, the fee paid, and the net SOL change.&lt;/p&gt;

&lt;p&gt;I found a failed transaction from Day 19. In the log messages, the error was clear:&lt;/p&gt;

&lt;p&gt;Program log: Error: insufficient lamports for instruction&lt;/p&gt;

&lt;p&gt;The equivalent of a 400 Bad Request except permanently recorded on a public blockchain. And I paid 5,000 lamports for the privilege of failing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; Failed API calls don't charge you. Failed Solana transactions do. The fee covers the computational work validators did to process the transaction, even if the result was rejection.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Console: Log Messages
&lt;/h2&gt;

&lt;p&gt;On Solana, programs emit log messages using &lt;code&gt;msg!()&lt;/code&gt; and those messages surface in Explorer under Log Messages for any transaction.&lt;/p&gt;

&lt;p&gt;For a complex interaction on mainnet:&lt;/p&gt;

&lt;p&gt;Program log: Instruction: Swap&lt;br&gt;
Program log: Swap: in_amount=1000000, out_amount=997234&lt;br&gt;
Program log: Fee collected: 2766 lamports&lt;br&gt;
Program JUP6... success&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; Imagine if every API call your app made logged its internal execution to a public server that anyone could read forever. That's exactly what on-chain program logs are.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Application Tab: Account Data
&lt;/h2&gt;

&lt;p&gt;In Explorer, clicking any account shows its decoded data. I clicked a token account in my wallet and Explorer decoded it: mint address, owner wallet, balance. All decoded from a binary blob by Explorer knowing the Token Program's schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; Inspecting a localStorage entry and finding &lt;code&gt;{"userId": "abc123", "balance": 1000000, "currency": "USDC"}&lt;/code&gt; except this lives on a blockchain, not your browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Elements Tab: The System Program
&lt;/h2&gt;

&lt;p&gt;I searched for &lt;code&gt;11111111111111111111111111111111&lt;/code&gt;. Balance: 1 SOL. Executable: Yes. Data: 14 bytes. Transaction count: millions.&lt;/p&gt;

&lt;p&gt;This is the program behind every SOL transfer I've ever made. It has a 1 SOL balance and almost no on-chain data because native programs live in the validator binary.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; The System Program is like the Node.js runtime the foundational layer everything builds on. You rarely think about it directly, but everything goes through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going Live: Mainnet in Real Time
&lt;/h2&gt;

&lt;p&gt;I watched the Explorer homepage for five minutes. Simple SOL transfers: 2 accounts, 5000 lamport fee. DEX swaps: 10-14 accounts, 3-4 programs, still 5000 lamport base fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; Watching your server access logs in real time except it's a public server processing millions of requests per second and every request is globally visible forever.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Changed for Me
&lt;/h2&gt;

&lt;p&gt;Explorer made the chain feel real in a way devnet never quite does. Devnet is practice. Mainnet is the game. Explorer shows you both.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>learning</category>
      <category>solana</category>
    </item>
    <item>
      <title>Solana's Account Types Are Just Database Rows With Different Flags</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Wed, 20 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/sammie_/solanas-account-types-are-just-database-rows-with-different-flags-33ge</link>
      <guid>https://dev.to/sammie_/solanas-account-types-are-just-database-rows-with-different-flags-33ge</guid>
      <description>&lt;h2&gt;
  
  
  The Surprise of Day 25
&lt;/h2&gt;

&lt;p&gt;When I got to Day 25 of 100 Days of Solana and inspected the System Program account for the first time, I expected something special. Some distinct "program" structure, different from the wallet accounts I'd been working with.&lt;/p&gt;

&lt;p&gt;Instead I got the same four fields I'd already seen a hundred times: balance, owner, executable, data. The only difference was &lt;code&gt;executable: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That was the moment "everything is an account" stopped being a tagline and became something I actually understood. This post explains what I found and what it means if you're coming from a Web2 background.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Web2 Mental Model You Need to Drop
&lt;/h2&gt;

&lt;p&gt;In Web2, different things have different types. A user account is a database row. Application code is a file on a server. Configuration data is an environment variable or a config service. They're stored differently, accessed differently, and reasoned about differently.&lt;/p&gt;

&lt;p&gt;Solana collapses all of this into one primitive. Everything your wallet, the code that processes transfers, the network's current timestamp is a row in the same global table with the same four columns.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Schema
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;accounts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;address&lt;/span&gt;    &lt;span class="nb"&gt;VARCHAR&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;lamports&lt;/span&gt;   &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="c1"&gt;-- SOL balance&lt;/span&gt;
  &lt;span class="k"&gt;owner&lt;/span&gt;      &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;       &lt;span class="c1"&gt;-- which program controls this row&lt;/span&gt;
  &lt;span class="k"&gt;data&lt;/span&gt;       &lt;span class="n"&gt;BYTEA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;         &lt;span class="c1"&gt;-- arbitrary payload&lt;/span&gt;
  &lt;span class="n"&gt;executable&lt;/span&gt; &lt;span class="nb"&gt;BOOLEAN&lt;/span&gt;        &lt;span class="c1"&gt;-- is this row code or data?&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Every account on Solana billions of them fits this schema. What varies is the values.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row Type 1: Your Wallet
&lt;/h2&gt;

&lt;p&gt;address:    YOUR_WALLET_ADDRESS&lt;br&gt;
lamports:   1,247,000,000  (1.247 SOL)&lt;br&gt;
owner:      11111111111111111111111111111111  (System Program)&lt;br&gt;
data:       empty&lt;br&gt;
executable: false&lt;/p&gt;

&lt;p&gt;Your wallet is the simplest possible row. No data payload, not executable, owned by the system program. The SOL balance is all that matters, and it lives in &lt;code&gt;lamports&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 equivalent:&lt;/strong&gt; A user record with just a balance field. No special logic is attached. The application server (system program) handles all operations on it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row Type 2: The System Program
&lt;/h2&gt;

&lt;p&gt;address:    11111111111111111111111111111111&lt;br&gt;
lamports:   1,000,000,000  (1 SOL)&lt;br&gt;
owner:      NativeLoader&lt;br&gt;
data:       14 bytes&lt;br&gt;
executable: true&lt;/p&gt;

&lt;p&gt;Same schema, completely different purpose. &lt;code&gt;executable: true&lt;/code&gt; means the runtime treats the &lt;code&gt;data&lt;/code&gt; field as code to execute, not state to store. When you call the System Program, the runtime looks up this row and runs its bytecode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 equivalent:&lt;/strong&gt; A stored procedure in your database. It lives in the same storage system as your data rows, but the database engine knows to execute it rather than return it as data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Row Type 3: Sysvar Accounts
&lt;/h2&gt;

&lt;p&gt;address:    SysvarC1ock11111111111111111111111111111111&lt;br&gt;
lamports:   1,169,280&lt;br&gt;
owner:      Sysvar1111111111111111111111111111111111111&lt;br&gt;
data:       40 bytes (current slot, epoch, timestamp)&lt;br&gt;
executable: false&lt;/p&gt;

&lt;p&gt;Sysvar accounts are read-only rows that the network itself writes to every slot. Programs read them to access runtime information: what slot is it? What's the current rent rate? What are the recent block hashes?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 equivalent:&lt;/strong&gt; A system configuration table that your application server updates automatically like a &lt;code&gt;system_config&lt;/code&gt; table with &lt;code&gt;current_time&lt;/code&gt;, &lt;code&gt;maintenance_mode&lt;/code&gt;, and &lt;code&gt;version&lt;/code&gt; columns. Your application code reads it but doesn't write it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Flag That Changes Everything
&lt;/h2&gt;

&lt;p&gt;The entire distinction between "code" and "data" in Solana comes down to one boolean: &lt;code&gt;executable&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;In Web2, code and data are fundamentally different things stored in different places one on your filesystem, one in your database. You never confuse them. In Solana, they're the same thing stored the same way. The flag is the only boundary.&lt;/p&gt;

&lt;p&gt;This has a profound implication: &lt;strong&gt;programs are inspectable the same way data is.&lt;/strong&gt; You can look up any program's account in a block explorer, see its bytecode, check its upgrade authority, read its transaction history. There's no separation between "application layer" and "data layer" it's all one public table.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Sat Underneath Everything I Built
&lt;/h2&gt;

&lt;p&gt;Looking back at 25 days of challenges through this lens:&lt;/p&gt;

&lt;p&gt;Every airdrop I received → System Program created or credited my wallet row.&lt;br&gt;
Every SOL transfer I sent → System Program debited my row and credited the recipient's.&lt;br&gt;
Every account I created for a new keypair → System Program inserted a new row.&lt;br&gt;
Every script that read account data → fetched rows from this global table.&lt;/p&gt;

&lt;p&gt;The System Program has been the invisible application server behind every operation. Day 25 was the first time I looked at it directly as an account and saw that it's just another row, with &lt;code&gt;executable: true&lt;/code&gt; and the NativeLoader as its owner.&lt;/p&gt;

&lt;p&gt;Same table. Same schema. Different flags.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>learning</category>
      <category>solana</category>
    </item>
    <item>
      <title>Sysvar Accounts: Solana's Live System Data, Explained for Developers</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Wed, 20 May 2026 12:01:58 +0000</pubDate>
      <link>https://dev.to/sammie_/sysvar-accounts-solanas-live-system-data-explained-for-developers-4097</link>
      <guid>https://dev.to/sammie_/sysvar-accounts-solanas-live-system-data-explained-for-developers-4097</guid>
      <description>&lt;h2&gt;
  
  
  The Accounts Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;If you ask a Solana developer what accounts are, they'll tell you about wallets and programs. If you ask them about sysvar accounts, there's a good chance they pause.&lt;/p&gt;

&lt;p&gt;Sysvars are the third category of accounts on Solana and one of the most useful once you're building programs that need to know anything about the current state of the network. This post explains what they are, how they work, and why they exist as accounts rather than as function calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is a Sysvar?
&lt;/h2&gt;

&lt;p&gt;A sysvar is a special on-chain account that the Solana runtime maintains automatically. Every slot, the network updates these accounts with current chain data: the current time, recent blockhashes, the rent rate, stake history, and more.&lt;/p&gt;

&lt;p&gt;Programs can read sysvar accounts as inputs to their instructions. Instead of having a &lt;code&gt;get_current_time()&lt;/code&gt; syscall, Solana gives you a &lt;code&gt;Clock&lt;/code&gt; account. Instead of a &lt;code&gt;get_rent_rate()&lt;/code&gt; function, there's a &lt;code&gt;Rent&lt;/code&gt; account.&lt;/p&gt;

&lt;p&gt;The design choice is intentional: by making system data available as accounts, programs access it the same way they access any other on-chain data by having the account passed as an input to the instruction.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Sysvar Accounts
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Clock &lt;code&gt;SysvarC1ock11111111111111111111111111111111&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contains the current network time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;slot&lt;/code&gt; the current slot number (~400ms per slot)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;epoch&lt;/code&gt; the current epoch (~2–3 days per epoch)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;unix_timestamp&lt;/code&gt; unix timestamp, updated approximately once per slot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;epoch_start_timestamp&lt;/code&gt; when the current epoch began&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;leader_schedule_epoch&lt;/code&gt; used for validator leader scheduling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programs use Clock when they need time-based logic: vesting schedules, time-locked accounts, auction deadlines. It's the on-chain equivalent of &lt;code&gt;Date.now()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rent &lt;code&gt;SysvarRent111111111111111111111111111111111&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contains the current rent parameters:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;lamports_per_byte_year&lt;/code&gt; the base rent rate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;exemption_threshold&lt;/code&gt; how many years of rent an account needs to hold to be rent-exempt&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;burn_percent&lt;/code&gt; what percentage of collected rent is burned&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Programs use Rent when creating new accounts they need to calculate the rent-exempt minimum to fund the account correctly. Without reading Rent, a program would have to hardcode the exemption amount, which can change via governance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;RecentBlockhashes &lt;code&gt;SysvarRecentB1ockHashes11111111111111111111&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contains the ~150 most recent block hashes. Transactions must include a recent blockhash as a validity window transactions referencing a blockhash older than ~150 slots are rejected as expired.&lt;/p&gt;

&lt;p&gt;This is the mechanism that prevents transaction replay attacks: you can't rebroadcast an old signed transaction because its blockhash will eventually expire.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EpochSchedule &lt;code&gt;SysvarEpochSchedu1e111111111111111111111111&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Contains the parameters that define epoch length and how slot counts ramp up during the warmup period. Programs that need to reason about epoch boundaries can use this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StakeHistory &lt;code&gt;SysvarStakeHistory11111111111111111111111111&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A record of total stake activating and deactivating per epoch. Used by the staking program to calculate how quickly stake delegations activate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instructions &lt;code&gt;Sysvar1nstructions1111111111111111111111111&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A special sysvar that contains the serialized instructions of the current transaction. Programs use this to inspect other instructions in the same transaction, useful for enforcing that certain instructions appear together.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Inspect Sysvars
&lt;/h2&gt;

&lt;p&gt;You can read any sysvar account directly from the CLI:&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;# Clock&lt;/span&gt;
solana account SysvarC1ock11111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet

&lt;span class="c"&gt;# Rent  &lt;/span&gt;
solana account SysvarRent111111111111111111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet

&lt;span class="c"&gt;# Recent blockhashes&lt;/span&gt;
solana account SysvarRecentB1ockHashes11111111111111111111 &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The raw output is binary-encoded data. To see decoded values, use a JSON RPC call:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl https://api.devnet.solana.com &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getAccountInfo",
  "params": [
    "SysvarC1ock11111111111111111111111111111111",
    {"encoding": "jsonParsed"}
  ]
}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;jsonParsed&lt;/code&gt; encoding tells the RPC to decode the known sysvar format into readable fields.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Accounts Instead of Syscalls?
&lt;/h2&gt;

&lt;p&gt;Other blockchains implement system data differently. Ethereum has &lt;code&gt;block.timestamp&lt;/code&gt; and &lt;code&gt;block.number&lt;/code&gt; as built-in variables accessible inside smart contract code no account required.&lt;/p&gt;

&lt;p&gt;Solana's account-based approach has a specific advantage: &lt;strong&gt;it fits the transaction model.&lt;/strong&gt; Solana transactions must declare every account they'll read upfront. By making sysvars accounts, a program that reads the clock must include the Clock sysvar in its account inputs making it statically visible which system data each instruction accesses before execution.&lt;/p&gt;

&lt;p&gt;This supports Solana's parallel execution model. The scheduler can see exactly which accounts (including sysvars) a transaction will read, and run non-conflicting transactions simultaneously.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sysvar Addresses Never Change
&lt;/h2&gt;

&lt;p&gt;One useful property: sysvar addresses are fixed constants, known at compile time. The Clock sysvar has always been &lt;code&gt;SysvarC1ock11111111111111111111111111111111&lt;/code&gt; and always will be. Programs hardcode these addresses as known constants rather than looking them up dynamically.&lt;/p&gt;

&lt;p&gt;In the Solana SDK:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;solana_program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;sysvar&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;CLOCK_SYSVAR&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;// CLOCK_SYSVAR == SysvarC1ock11111111111111111111111111111111&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Full Picture
&lt;/h2&gt;

&lt;p&gt;Sysvar accounts complete the "everything is an account" model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Wallet accounts&lt;/strong&gt; user-owned data, managed by the System Program&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Program accounts&lt;/strong&gt; executable bytecode, managed by the BPF Loader&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data accounts&lt;/strong&gt; program-owned state, managed by user programs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sysvar accounts&lt;/strong&gt; network-owned runtime data, managed by the Solana runtime itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four types. One storage model. Every category fits the same four-field account structure just with different owners, executability flags, and data payloads.&lt;/p&gt;

&lt;p&gt;Sysvars are the part of that model that gives programs a window into the live state of the network they're running on.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>learning</category>
    </item>
    <item>
      <title>Creating a Solana Token Is Like Building a Rewards System Except You Don't Write the Backend</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Tue, 19 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/sammie_/creating-a-solana-token-is-like-building-a-rewards-system-except-you-dont-write-the-backend-1con</link>
      <guid>https://dev.to/sammie_/creating-a-solana-token-is-like-building-a-rewards-system-except-you-dont-write-the-backend-1con</guid>
      <description>&lt;h2&gt;
  
  
  Every App Has a Credits System
&lt;/h2&gt;

&lt;p&gt;Loyalty points. In-game currency. Reward tokens. Internal credits. If you've built any kind of consumer Web2 app, you've probably built some version of this: users accumulate a balance of something, they can spend it, and your database is the authoritative ledger.&lt;/p&gt;

&lt;p&gt;Day 29 of 100 Days of Solana is about building the exact same thing except on Solana, you don't write the backend. It already exists. You just configure it and plug in.&lt;/p&gt;

&lt;p&gt;Let me show you how the concepts map.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Web2 Version
&lt;/h2&gt;

&lt;p&gt;In a typical Web2 rewards system, you'd have something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- The currency definition&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;token_types&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;symbol&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;decimals&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;total_supply&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;issuer_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;-- User balances&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;token_accounts&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;token_type_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;token_types&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;user_id&lt;/span&gt; &lt;span class="n"&gt;UUID&lt;/span&gt; &lt;span class="k"&gt;REFERENCES&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="n"&gt;balance&lt;/span&gt; &lt;span class="nb"&gt;BIGINT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your application server handles all the logic: validating that the issuer is authorized to mint, checking that balances don't go negative on transfers, enforcing the rules you define.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solana Version
&lt;/h2&gt;

&lt;p&gt;On Solana, the same structure exists but it's all on-chain:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;token_types → Token Mint Account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mint account is your token definition. It stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Total supply&lt;/li&gt;
&lt;li&gt;Decimal places&lt;/li&gt;
&lt;li&gt;Mint authority (who can create more tokens)&lt;/li&gt;
&lt;li&gt;Freeze authority (who can freeze accounts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Create it with one CLI command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token
&lt;span class="c"&gt;# Returns: your mint address (the "id" of your token type)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;token_accounts → Token Account&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Each user's balance lives in a separate token account one per token type per wallet. It stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which mint it belongs to&lt;/li&gt;
&lt;li&gt;Which wallet owns it&lt;/li&gt;
&lt;li&gt;The current balance
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-account &amp;lt;MINT_ADDRESS&amp;gt;
&lt;span class="c"&gt;# Returns: your token account address&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Your application server → The SPL Token Program&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This is the key shift. In Web2, you write the business logic. On Solana, the Token Program (&lt;code&gt;TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/code&gt;) is a shared, audited, already-deployed program that handles all of it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only the mint authority can mint new tokens ✓&lt;/li&gt;
&lt;li&gt;Balances can't go negative ✓&lt;/li&gt;
&lt;li&gt;Only the account owner can transfer tokens ✓&lt;/li&gt;
&lt;li&gt;Frozen accounts can't be transferred ✓&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't write any of this. You invoke the Token Program's instructions, and it enforces the rules.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minting Is Just a Database Insert
&lt;/h2&gt;

&lt;p&gt;In Web2:&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;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATE token_accounts SET balance = balance + $1 WHERE id = $2&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tokenAccountId&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;UPDATE token_types SET total_supply = total_supply + $1 WHERE id = $2&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="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;tokenTypeId&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;On Solana:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token mint &amp;lt;MINT_ADDRESS&amp;gt; 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. The Token Program handles both the balance update and the supply update atomically just like your database transaction would.&lt;/p&gt;

&lt;p&gt;The difference: your Web2 database trusts your application server. Solana's on-chain accounts trust the Token Program. And the Token Program checks that whoever sent this transaction is actually the mint authority before allowing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Separation That Changes Everything
&lt;/h2&gt;

&lt;p&gt;The biggest mental shift from Web2 to Solana tokens is the separation between the token definition and the token balance.&lt;/p&gt;

&lt;p&gt;In Web2, you might store both in the same table, or at least in the same database under the same access control. A user's "account" and their "balance" are tightly coupled.&lt;/p&gt;

&lt;p&gt;On Solana, they're always separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;mint&lt;/strong&gt; defines the token (one account, exists once)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token accounts&lt;/strong&gt; hold balances (one per wallet per token type)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The mint's rules can change (if you update the authority) without touching any user balances&lt;/li&gt;
&lt;li&gt;User balances are visible to anyone the blockchain is public&lt;/li&gt;
&lt;li&gt;Closing an empty token account returns the rent deposit to the user (about 0.002 SOL)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why This Model Wins for Public Digital Assets
&lt;/h2&gt;

&lt;p&gt;In Web2, your credits system is only as trustworthy as you are. Users have to trust that you won't manipulate the database, arbitrarily inflate supply, or freeze their accounts without notice.&lt;/p&gt;

&lt;p&gt;On Solana, the rules are enforced by code that anyone can read and verify. If you renounce your mint authority (set it to null), no new tokens can ever be created and this is verifiable by anyone looking at the mint account in a block explorer. The supply is permanently capped by cryptographic enforcement, not by your promise.&lt;/p&gt;

&lt;p&gt;For internal company credits, this might not matter. For a public token that real users hold real value in, it matters enormously.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Build in One CLI Session
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create the token definition&lt;/span&gt;
spl-token create-token
&lt;span class="c"&gt;# → returns MINT_ADDRESS&lt;/span&gt;

&lt;span class="c"&gt;# Create your balance account  &lt;/span&gt;
spl-token create-account MINT_ADDRESS
&lt;span class="c"&gt;# → returns TOKEN_ACCOUNT_ADDRESS&lt;/span&gt;

&lt;span class="c"&gt;# Mint 100 tokens to yourself&lt;/span&gt;
spl-token mint MINT_ADDRESS 100

&lt;span class="c"&gt;# Verify&lt;/span&gt;
spl-token balance MINT_ADDRESS
&lt;span class="c"&gt;# → 100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Four commands. You now have a functioning token on a live blockchain. No smart contract written, no backend deployed, no database configured.&lt;/p&gt;

&lt;p&gt;The infrastructure was already there. You just used it.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>web3</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to Create Your First Token on Solana Devnet (SPL Token CLI Walkthrough)</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Tue, 19 May 2026 13:39:05 +0000</pubDate>
      <link>https://dev.to/sammie_/how-to-create-your-first-token-on-solana-devnet-spl-token-cli-walkthrough-9mk</link>
      <guid>https://dev.to/sammie_/how-to-create-your-first-token-on-solana-devnet-spl-token-cli-walkthrough-9mk</guid>
      <description>&lt;h2&gt;
  
  
  Welcome to Epoch 2
&lt;/h2&gt;

&lt;p&gt;If you've been following 100 Days of Solana, you've spent the first 28 days learning how Solana stores and reads data wallets, accounts, transactions, and explorers. Epoch 2 shifts gears from reading to creating. And it starts with the most fundamental creative act on Solana: making a token.&lt;/p&gt;

&lt;p&gt;This is a complete walkthrough of Day 29's challenge: create a token on devnet using the SPL Token CLI, mint 100 units, and understand what you actually built.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Make sure you have the Solana CLI installed and configured for 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 config &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;--url&lt;/span&gt; devnet
solana airdrop 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then install the SPL Token CLI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cargo &lt;span class="nb"&gt;install &lt;/span&gt;spl-token-cli
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify it's working:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1: Create a Token Mint
&lt;/h2&gt;

&lt;p&gt;A token mint is the on-chain account that defines your token its total supply, how many decimal places it has, and who has authority to create more. Think of it as the "factory" for your token, not the token balance itself.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-token
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Creating token 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU&lt;br&gt;
Address: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU&lt;br&gt;
Decimals: 9&lt;br&gt;
Signature: 5wTgYNMBRULKGSfRQkFsgSbxwFAq3QQtHbdxiR3LYLU5t3sGRD4ETFZHDvFBRTHxgfEjS5c1s6GfmFE8bqjyJwH&lt;/p&gt;

&lt;p&gt;Save that token address you'll need it for every subsequent step. The address is the mint account's public key on-chain. Anyone who knows this address can look it up in Explorer and see everything about your token: total supply, decimals, mint authority.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What just happened:&lt;/strong&gt; The SPL Token CLI sent a transaction that created a new account on devnet, owned by the Token Program (&lt;code&gt;TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA&lt;/code&gt;). That account is your mint. It currently has 0 supply and you are the mint authority.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Create a Token Account
&lt;/h2&gt;

&lt;p&gt;Here's where Solana's design becomes visible: your wallet doesn't hold tokens directly. You need a separate &lt;strong&gt;token account&lt;/strong&gt; an account owned by the Token Program that holds your balance of a specific token.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token create-account 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;/p&gt;

&lt;p&gt;Creating account 8uFLaHUJnqFhDxdKWV3TvMSRbsF3Y6gUpUMfzM9JqwbA&lt;br&gt;
Signature: 4QhmnBkNKoK8JXpSv9NXhLJzuRSN9fGPgZ3JpKvwWMTe...&lt;/p&gt;

&lt;p&gt;This new address (&lt;code&gt;8uFLaHUJ...&lt;/code&gt;) is your token account the account that will hold your balance of your new token. It's a separate account from your wallet, owned by the Token Program, and linked to both your mint and your wallet address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost note:&lt;/strong&gt; Creating a token account requires a rent-exempt deposit of approximately 0.00203928 SOL. This SOL is returned to you if you ever close the account. This is why receiving a new token sometimes costs a small amount the token account deposit.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Mint Some Supply
&lt;/h2&gt;

&lt;p&gt;Now you can actually create tokens. Since you're the mint authority, you control how many tokens come into existence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token mint 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU 100
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output:&lt;br&gt;
Minting 100 tokens&lt;br&gt;
Token: 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU&lt;br&gt;
Recipient: 8uFLaHUJnqFhDxdKWV3TvMSRbsF3Y6gUpUMfzM9JqwbA&lt;br&gt;
Signature: 2XkR7...&lt;/p&gt;

&lt;p&gt;100 tokens now exist. They live in your token account. The mint's total supply is now 100.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 4: Inspect What You Built
&lt;/h2&gt;

&lt;p&gt;Check your balance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token balance 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output: &lt;code&gt;100&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Check the mint's supply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token supply 7xKXtg2CW87d97TXJSDpbD5jBkheTqA83TZRuJosgAsU
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output: &lt;code&gt;100&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;List all your token accounts:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;spl-token accounts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see a table showing your token mint address, your token account address, and your balance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Verify in Explorer
&lt;/h2&gt;

&lt;p&gt;Paste your mint address into &lt;a href="https://explorer.solana.com" rel="noopener noreferrer"&gt;explorer.solana.com&lt;/a&gt; (switch to devnet). You'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Token Supply:&lt;/strong&gt; 100&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Decimals:&lt;/strong&gt; 9&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mint Authority:&lt;/strong&gt; your wallet address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Freeze Authority:&lt;/strong&gt; None (you didn't set one)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now paste your token account address. You'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mint:&lt;/strong&gt; your token mint address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; your wallet address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Token Balance:&lt;/strong&gt; 100&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two separate accounts, both visible on-chain, both part of the same token system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Actually Built
&lt;/h2&gt;

&lt;p&gt;In Web2 terms, you just built a custom credits system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The mint&lt;/strong&gt; = your database schema + business rules ("this currency has 9 decimal places, only I can create more")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The token account&lt;/strong&gt; = a row in your ledger ("this user holds 100 credits")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Token Program&lt;/strong&gt; = the application server that enforces all the rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The difference from Web2: you didn't build any of the application server. The Token Program already exists on Solana and handles all the logic. You just created the data accounts and invoked its instructions.&lt;/p&gt;

&lt;p&gt;This is the core insight of Epoch 2: Solana's shared programs let you launch digital assets without writing any program code yourself. The infrastructure already exists. You're using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next in Epoch 2
&lt;/h2&gt;

&lt;p&gt;Now that you have a token, Epoch 2 will cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding metadata (name, symbol, image) so your token appears properly in wallets&lt;/li&gt;
&lt;li&gt;Transfer rules and fees&lt;/li&gt;
&lt;li&gt;Freeze authorities&lt;/li&gt;
&lt;li&gt;Eventually: NFTs, which are just tokens with supply of 1 and 0 decimals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The foundation you built today mint + token account + SPL Token Program is the same foundation that every token on Solana is built on, from small devnet experiments to billion-dollar DeFi protocols.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>learning</category>
    </item>
    <item>
      <title>How to Read a Solana Transaction in Explorer: A Developer's Field Guide</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Mon, 18 May 2026 15:00:00 +0000</pubDate>
      <link>https://dev.to/sammie_/how-to-read-a-solana-transaction-in-explorer-a-developers-field-guide-2djb</link>
      <guid>https://dev.to/sammie_/how-to-read-a-solana-transaction-in-explorer-a-developers-field-guide-2djb</guid>
      <description>&lt;h2&gt;
  
  
  The Transaction Is the Unit of Work
&lt;/h2&gt;

&lt;p&gt;Everything that happens on Solana happens inside a transaction. Account balances change, tokens move, programs execute all of it is packaged into transactions, confirmed by validators, and recorded permanently on-chain.&lt;/p&gt;

&lt;p&gt;Solana Explorer makes every transaction readable. But if you're new to Solana, the transaction detail page has a lot of information and it's not immediately obvious what to focus on.&lt;/p&gt;

&lt;p&gt;This is a field guide to reading a Solana transaction in Explorer. By the end you'll know what every section means, what to look at first, and how to use transactions to debug your own programs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explorer used:&lt;/strong&gt; &lt;a href="https://explorer.solana.com" rel="noopener noreferrer"&gt;explorer.solana.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Find a Transaction
&lt;/h2&gt;

&lt;p&gt;You need a transaction signature the long base58 string that every &lt;code&gt;sendTransaction()&lt;/code&gt; call returns. If you've been doing 100 Days of Solana, you've logged hundreds of these to your console and probably never looked at them again.&lt;/p&gt;

&lt;p&gt;Go back to any script you've run and grab a signature. Paste it into the Explorer search bar. You'll land on the transaction detail page.&lt;/p&gt;

&lt;p&gt;Alternatively: search your wallet address, go to Transaction History, and click any entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 1: The Header
&lt;/h2&gt;

&lt;p&gt;The first thing you see is the result banner green for success, red for failure. This is the single most important piece of information on the page.&lt;/p&gt;

&lt;p&gt;Below that:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signature&lt;/strong&gt;  The unique identifier for this transaction. This is what you'd share if you wanted someone else to look at the same transaction. Think of it like a receipt number.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Block&lt;/strong&gt;  The slot (Solana's equivalent of a block number) when this transaction was confirmed. Solana produces a new slot roughly every 400ms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timestamp&lt;/strong&gt;  When the slot was confirmed. The gap between when you submitted the transaction and this timestamp is your actual confirmation time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fee&lt;/strong&gt;  Almost always 5,000 lamports (0.000005 SOL) for standard transactions. This is the base fee. Transactions that consume more compute units may pay higher fees, but for most operations you'll see this flat amount.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fee Payer&lt;/strong&gt;  The wallet that paid the fee. Usually the transaction signer, but can be a different account if you're building apps that sponsor fees for users.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 2: Account Inputs
&lt;/h2&gt;

&lt;p&gt;This section lists every account the transaction touched, with flags showing how each was used.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Writable&lt;/strong&gt;  This account's data or balance was modified by the transaction. If you're transferring SOL, both the sender and recipient are writable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signer&lt;/strong&gt;  This account signed the transaction, authorizing it. The fee payer is always a signer. In most user transactions, your wallet is the only signer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Program&lt;/strong&gt;  This account is a program that was invoked during the transaction. It's not modified by the transaction; it's the code that processed it.&lt;/p&gt;

&lt;p&gt;Reading the account inputs list tells you: who authorized this transaction, what accounts were changed, and which programs handled the execution. This is the "cast of characters" for everything that follows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt; If a transaction failed and you're debugging, check that the accounts you expected to be writable are actually marked writable. A common mistake is forgetting to mark an account as writable when constructing the transaction the runtime will reject it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 3: Instructions
&lt;/h2&gt;

&lt;p&gt;Each instruction in a transaction maps to one program invocation. A simple SOL transfer has one instruction. A DEX swap might have five.&lt;/p&gt;

&lt;p&gt;For each instruction you'll see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which program handled it&lt;/li&gt;
&lt;li&gt;The accounts passed to that instruction&lt;/li&gt;
&lt;li&gt;The raw instruction data (usually encoded, but Explorer decodes it for standard programs)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the System Program's transfer instruction, Explorer shows you the decoded fields: from, to, and lamports. For custom programs without a known IDL, you'll see raw bytes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt; If a transaction involves multiple instructions and one failed, the instruction breakdown shows you which one. The error will trace back to a specific program invocation, which narrows down where the problem is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 4: Log Messages
&lt;/h2&gt;

&lt;p&gt;This is the most useful section for developers. Every &lt;code&gt;msg!()&lt;/code&gt; call from every program invoked in the transaction appears here, in execution order.&lt;/p&gt;

&lt;p&gt;A successful simple transfer:&lt;/p&gt;

&lt;p&gt;Program 11111111111111111111111111111111 invoke [1]&lt;br&gt;
Program 11111111111111111111111111111111 success&lt;/p&gt;

&lt;p&gt;A failed transaction with a custom program:&lt;/p&gt;

&lt;p&gt;Program YourProgram1111111111111111111111111111111 invoke [1]&lt;br&gt;
Program log: Checking account ownership&lt;br&gt;
Program log: Error: account not owned by this program&lt;br&gt;
Program YourProgram1111111111111111111111111111111 failed: custom program error: 0x0&lt;/p&gt;

&lt;p&gt;The log messages tell you the story of execution. What was checked, what was found, where it went wrong. For any non-trivial program, this is your primary debugging tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What to look for:&lt;/strong&gt; The error message at the end of a failed program invocation. Cross-reference it with the program's source code to find the &lt;code&gt;msg!()&lt;/code&gt; or &lt;code&gt;return Err()&lt;/code&gt; call that produced it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Section 5: Token Balances (if applicable)
&lt;/h2&gt;

&lt;p&gt;If the transaction involved SPL tokens, Explorer shows a before/after table for every token account that changed.&lt;/p&gt;

&lt;p&gt;This is invaluable for verifying token transfers: you can see the exact amount that moved, from which account, to which account, and confirm it matches what your code intended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It Together: A Debugging Workflow
&lt;/h2&gt;

&lt;p&gt;When one of your transactions fails:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Grab the signature from your console output&lt;/li&gt;
&lt;li&gt;Open it in Explorer (switch to devnet if needed)&lt;/li&gt;
&lt;li&gt;Check the result banner failure confirmed&lt;/li&gt;
&lt;li&gt;Read the log messages section from top to bottom&lt;/li&gt;
&lt;li&gt;Find the &lt;code&gt;failed:&lt;/code&gt; line and the error message above it&lt;/li&gt;
&lt;li&gt;Trace that error back to your program code&lt;/li&gt;
&lt;li&gt;Check the account inputs are all writable accounts marked writable? Is the right wallet signing?&lt;/li&gt;
&lt;li&gt;Fix, redeploy or re-run, and paste the new signature back into Explorer to verify&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This workflow has saved me more debugging time than any other single practice in the challenge. Explorer isn't optional infrastructure it's a core part of the development loop.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>learning</category>
    </item>
    <item>
      <title>I Used Solana Explorer Like Chrome DevTools. Here's What I Found</title>
      <dc:creator>Samuel Akoji</dc:creator>
      <pubDate>Mon, 18 May 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/sammie_/i-used-solana-explorer-like-chrome-devtools-heres-what-i-found-4dlg</link>
      <guid>https://dev.to/sammie_/i-used-solana-explorer-like-chrome-devtools-heres-what-i-found-4dlg</guid>
      <description>&lt;h2&gt;
  
  
  DevTools for the Blockchain
&lt;/h2&gt;

&lt;p&gt;Every Web2 developer has a relationship with Chrome DevTools. You open it without thinking. Network tab to check API calls, Console to catch errors, Application tab to inspect localStorage. It's the lens you use to see what your app is actually doing beneath the surface.&lt;/p&gt;

&lt;p&gt;Day 28 of 100 Days of Solana sent me to Solana Explorer with the same mindset: just look at the chain. No task, no script. Just explore.&lt;/p&gt;

&lt;p&gt;Here's what I found when I treated Explorer like DevTools and what each discovery maps to in Web2 terms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Explorer used:&lt;/strong&gt; &lt;a href="https://explorer.solana.com" rel="noopener noreferrer"&gt;explorer.solana.com&lt;/a&gt; Devnet, then Mainnet&lt;/p&gt;

&lt;h2&gt;
  
  
  The Network Tab: My Transaction History
&lt;/h2&gt;

&lt;p&gt;In DevTools, the Network tab is the first place I go when something isn't working. It shows every request, every response, every status code.&lt;/p&gt;

&lt;p&gt;My wallet's transaction history in Explorer is exactly that every "request" my wallet has sent to the blockchain since Day 1 of the challenge. 27 transactions, laid out chronologically. Each one shows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which program was called (the "endpoint")&lt;/li&gt;
&lt;li&gt;Whether it succeeded or failed (the "status code")&lt;/li&gt;
&lt;li&gt;The fee paid (the "cost")&lt;/li&gt;
&lt;li&gt;The net SOL change (the "response payload")&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I found a failed transaction from Day 19 that I'd half-forgotten about. In the log messages, the error was clear:&lt;/p&gt;

&lt;p&gt;Program log: Error: insufficient lamports for instruction&lt;/p&gt;

&lt;p&gt;The equivalent of a 400 Bad Request except this one is permanently recorded on a public blockchain and I paid 5,000 lamports for the privilege of failing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; Failed API calls don't charge you. Failed Solana transactions do. The fee covers the computational work validators did to process the transaction, even if the result was rejection.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Console: Log Messages
&lt;/h2&gt;

&lt;p&gt;In Web2, &lt;code&gt;console.log()&lt;/code&gt; is how you peek inside running code. In Solana programs, &lt;code&gt;msg!()&lt;/code&gt; is the equivalent and those messages surface in Explorer under the Log Messages section of any transaction.&lt;/p&gt;

&lt;p&gt;For my successful SOL transfer from Day 16:&lt;br&gt;
Program 11111111111111111111111111111111 invoke [1]&lt;br&gt;
Program 11111111111111111111111111111111 success&lt;/p&gt;

&lt;p&gt;For a more complex interaction I found on mainnet:&lt;/p&gt;

&lt;p&gt;Program log: Instruction: Swap&lt;br&gt;
Program log: Swap: in_amount=1000000, out_amount=997234&lt;br&gt;
Program log: Fee collected: 2,766 lamports&lt;br&gt;
Program JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4 success&lt;/p&gt;

&lt;p&gt;The program logged its own business logic input amount, output amount, and fee. Developers chose to surface this information, and now it's permanently readable by anyone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; Imagine if every API call your app made logged its internal execution to a public server that anyone could read forever. That's exactly what on-chain program logs are. Design your logs accordingly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Application Tab: Account Data
&lt;/h2&gt;

&lt;p&gt;In DevTools, the Application tab shows you what your app is storing localStorage, sessionStorage, cookies. It's the state layer.&lt;/p&gt;

&lt;p&gt;On Solana, every account's data field is the equivalent. In Explorer, clicking any account shows you its stored bytes and for well-known programs, Explorer decodes them into readable fields.&lt;/p&gt;

&lt;p&gt;I clicked on a token account in my wallet. Explorer decoded it to show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Mint:&lt;/strong&gt; the USDC devnet mint address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Owner:&lt;/strong&gt; my wallet address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amount:&lt;/strong&gt; my token balance, in the token's smallest unit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State:&lt;/strong&gt; Initialized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Four fields, decoded from a binary blob. The Token Program defined the schema; Explorer knows the schema because the Token Program is a standard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; It's like inspecting a localStorage entry and finding &lt;code&gt;{"userId": "abc123", "balance": 1000000, "currency": "USDC"}&lt;/code&gt; except this entry lives on a blockchain instead of your browser, and the schema is defined by a deployed program instead of your frontend code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Elements Tab: The System Program
&lt;/h2&gt;

&lt;p&gt;In DevTools, the Elements tab lets you inspect the DOM the structure of the page itself, not just the content.&lt;/p&gt;

&lt;p&gt;The System Program is the structure of Solana itself. I searched for it in Explorer: &lt;code&gt;11111111111111111111111111111111&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;What I saw was surprisingly minimal:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Balance: 1 SOL&lt;/li&gt;
&lt;li&gt;Executable: Yes&lt;/li&gt;
&lt;li&gt;Data: a small number of bytes&lt;/li&gt;
&lt;li&gt;Transaction count: millions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the program that handles every SOL transfer, every account creation, every airdrop. It's been invoked hundreds of millions of times. It has a 1 SOL balance and almost no on-chain data because, as a native program, its code lives in the validator binary rather than in account data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; The System Program is like the Node.js runtime or the browser's fetch API the foundational layer that higher-level code builds on. You rarely think about it directly, but everything you do goes through it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Going Live: Mainnet in Real Time
&lt;/h2&gt;

&lt;p&gt;I switched to mainnet and watched the Explorer homepage for five minutes. Transactions coming in constantly. Some I recognized:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simple SOL transfers: 2 accounts, System Program, 5000 lamport fee&lt;/li&gt;
&lt;li&gt;Token transfers: 3-4 accounts, Token Program, 5000 lamport fee
&lt;/li&gt;
&lt;li&gt;DEX swaps: 10-14 accounts, 3-4 programs, 5000 lamport fee&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Web2 parallel:&lt;/strong&gt; It's like watching your server access logs in real time except it's a public server that processes millions of requests per second, every request is globally visible, and you can click into any one to see the full execution trace.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Changed for Me
&lt;/h2&gt;

&lt;p&gt;I've been building on devnet for 28 days. Switching to mainnet Explorer and watching real transactions was a reminder that this infrastructure is live, processing billions in value daily, and every pattern I'm learning right now applies to that real environment.&lt;/p&gt;

&lt;p&gt;Explorer made the chain feel real in a way that devnet never quite does. Devnet is practice. Mainnet is the game. Explorer shows you both.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>web3</category>
      <category>solana</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
