<?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: Hala Kabir</title>
    <description>The latest articles on DEV Community by Hala Kabir (@halakabir234hub).</description>
    <link>https://dev.to/halakabir234hub</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3648193%2F98075c33-a355-4103-8adb-90ed38b5b12a.png</url>
      <title>DEV Community: Hala Kabir</title>
      <link>https://dev.to/halakabir234hub</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/halakabir234hub"/>
    <language>en</language>
    <item>
      <title>🚀 Day 97: Building a Guardrailed On-Chain AI Agent on Solana 🤖⛓️</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Sun, 26 Jul 2026 02:22:26 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/day-97-building-a-guardrailed-on-chain-ai-agent-on-solana-31f7</link>
      <guid>https://dev.to/halakabir234hub/day-97-building-a-guardrailed-on-chain-ai-agent-on-solana-31f7</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/halakabir234hub/building-a-guardrailed-on-chain-solana-ai-agent-day-97-2gim" class="crayons-story__hidden-navigation-link"&gt;Building a Guardrailed On-Chain Solana AI Agent (Day 97)&lt;/a&gt;


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

          &lt;a href="/halakabir234hub" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3648193%2F98075c33-a355-4103-8adb-90ed38b5b12a.png" alt="halakabir234hub profile" class="crayons-avatar__image" width="420" height="420"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/halakabir234hub" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Hala Kabir
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Hala Kabir
                
              
              &lt;div id="story-author-preview-content-4232693" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/halakabir234hub" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3648193%2F98075c33-a355-4103-8adb-90ed38b5b12a.png" class="crayons-avatar__image" alt="" width="420" height="420"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Hala Kabir&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/halakabir234hub/building-a-guardrailed-on-chain-solana-ai-agent-day-97-2gim" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/halakabir234hub/building-a-guardrailed-on-chain-solana-ai-agent-day-97-2gim" id="article-link-4232693"&gt;
          Building a Guardrailed On-Chain Solana AI Agent (Day 97)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/100daysofsolana"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;100daysofsolana&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/blockchain"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;blockchain&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/web3"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;web3&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/halakabir234hub/building-a-guardrailed-on-chain-solana-ai-agent-day-97-2gim#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

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

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

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

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>crypto</category>
      <category>web3</category>
    </item>
    <item>
      <title>Building a Guardrailed On-Chain Solana AI Agent (Day 97)</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Sat, 25 Jul 2026 19:06:58 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/building-a-guardrailed-on-chain-solana-ai-agent-day-97-2gim</link>
      <guid>https://dev.to/halakabir234hub/building-a-guardrailed-on-chain-solana-ai-agent-day-97-2gim</guid>
      <description>&lt;h1&gt;
  
  
  Building a Guardrailed On-Chain Solana AI Agent
&lt;/h1&gt;

&lt;p&gt;Autonomous AI agents interacting with blockchain wallets present both immense potential and significant security risks. Giving an LLM direct access to private keys without strict guardrails can quickly lead to drained wallets or unauthorized execution.&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Day 97 of 100 Days of Solana&lt;/strong&gt;, I built and documented a production-grade on-chain workflow agent that features a &lt;strong&gt;deny-by-default policy engine&lt;/strong&gt;, structured tool-calling loops, and full execution logging.&lt;/p&gt;




&lt;h2&gt;
  
  
  🛠️ System Architecture &amp;amp; How It Works
&lt;/h2&gt;

&lt;p&gt;The architecture separates the agent's decision-making layer (LLM) from actual wallet execution through a strict &lt;strong&gt;Policy Middleware Layer&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Autonomous Decision Engine&lt;/strong&gt;: Uses an LLM tool-calling loop (via OpenRouter) to evaluate goal states (e.g., &lt;em&gt;"Ensure savings wallet holds at least 0.2 SOL"&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Policy Enforcement Layer&lt;/strong&gt;: Intercepts every tool call requested by the model before hitting the blockchain.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Deny-by-Default Guardrail&lt;/strong&gt;: Any transaction request exceeding safety parameters is automatically rejected.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limit Validation&lt;/strong&gt;: Enforces maximum transfer caps per run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recipient Verification&lt;/strong&gt;: Validates destination addresses against known white-listed account sets.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured Run-Log&lt;/strong&gt;: Records all system states, model inputs/outputs, tool payloads, policy approvals/denials, and final execution signatures into a clean &lt;code&gt;run-log.json&lt;/code&gt; report.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚀 Quickstart &amp;amp; Setup Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js (v18+)&lt;/li&gt;
&lt;li&gt;OpenRouter API Key (for LLM reasoning)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Environment Setup
&lt;/h3&gt;

&lt;p&gt;Clone the repository and install dependencies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bash
npm &lt;span class="nb"&gt;install&lt;/span&gt; @solana/web3.js dotenv
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENROUTER_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"your-openrouter-key"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Keypair Configuration
&lt;/h3&gt;

&lt;p&gt;Generate or load the operating and savings keypairs:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;This populates &lt;code&gt;agent-wallet.json&lt;/code&gt; (operating wallet) and &lt;code&gt;savings-wallet.json&lt;/code&gt; (savings wallet).&lt;/p&gt;

&lt;h2&gt;
  
  
  💻 Running the Agent Workflow
&lt;/h2&gt;

&lt;p&gt;You can run the agent against Solana Devnet or using the local mock environment:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Execution Output Sample:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GOAL: Ensure the savings wallet holds at least 0.2 SOL. Check balances before moving anything, move only what is needed from the operating wallet, and verify final balances.

--- Turn 1 ---
[tool] get_balance({"address":"5fzNoe96en7mSc23bcywuDn5kguo8yGTFmSa1evUedEj"}) -&amp;gt; { lamports: 0 }

--- Turn 2 ---
[tool] get_balance({"address":"B2rbFAthmaTvhWoFHt4Ar1tEnX4hsutavT4Wdv9KD5nM"}) -&amp;gt; { lamports: 1000000000 }

--- Turn 3 ---
[tool] transfer_sol({"lamports":200000000,"to":"5fzNoe96en7mSc23bcywuDn5kguo8yGTFmSa1evUedEj"}) 
-&amp;gt; { status: 'confirmed', signature: 'mock_tx_sig_3vx32gid79' }

--- Turn 4 ---
=== FINAL REPORT ===
The savings wallet balance is now 200,000,000 lamports (0.2 SOL). Task completed successfully.
Run log written to run-log.json
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔒 Policy Safety Contract
&lt;/h2&gt;

&lt;p&gt;The policy engine implements the following explicit rules:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;validatePolicy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;transfer_sol&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;lamports&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;MAX_TRANSFER_LIMIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Policy Violation: Transfer amount exceeds max limit of &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;MAX_TRANSFER_LIMIT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; lamports.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;ALLOWED_RECIPIENTS&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Policy Violation: Recipient &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; is not whitelisted.`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  📝 Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Never trust LLM output directly for web3 writes:&lt;/strong&gt; Always run transactions through an independent, deterministic policy checker.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Deterministic Fallbacks:&lt;/strong&gt; Including local mock/dry-run capabilities ensures agent pipelines remain resilient even during external RPC rate limits or network issues.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Auditability:&lt;/strong&gt; Complete structured logging (&lt;code&gt;run-log.json&lt;/code&gt;) allows developers to verify every decision path taken by the AI before and after execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>100daysofsolana</category>
      <category>blockchain</category>
      <category>ai</category>
      <category>web3</category>
    </item>
    <item>
      <title>EcoQuantum Solution Beta Testing Needed -Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Tue, 14 Jul 2026 23:13:40 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/ecoquantum-solution-beta-testing-needed-hala-kabir-29n3</link>
      <guid>https://dev.to/halakabir234hub/ecoquantum-solution-beta-testing-needed-hala-kabir-29n3</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/mlhacks"&gt;@mlhacks&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/matthewrevell"&gt;@matthewrevell&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/niranjannlc"&gt;@niranjannlc&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/hferreiro"&gt;@hferreiro&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/developerscode"&gt;@developerscode&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/dzhavat"&gt;@dzhavat&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/anotherdevblog"&gt;@anotherdevblog&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/molly"&gt;@molly&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/sammie_"&gt;@sammie_&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/bosepchuk"&gt;@bosepchuk&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Hi can you give favor in &lt;strong&gt;testing app for 14 days&lt;/strong&gt;....? 🚀 EcoQuantum Solution Beta Testing We need as many people as we can get..&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Join our testing group&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://groups.google.com/g/ecoquantum-beta-testers" rel="noopener noreferrer"&gt;https://groups.google.com/g/ecoquantum-beta-testers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Become a beta tester&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://play.google.com/apps/testing/com.ecoquantum.solution" rel="noopener noreferrer"&gt;https://play.google.com/apps/testing/com.ecoquantum.solution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Install the app from Play Store and test it.&lt;br&gt;
Share Screen shot too after downloading &lt;br&gt;
Please keep the app installed for &lt;strong&gt;14 days&lt;/strong&gt; and share &lt;strong&gt;feedback&lt;/strong&gt; spent &lt;strong&gt;2 mins daily&lt;/strong&gt; on app 💚.   Regards&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Missing Days 83 &amp; 84 in the MLH "100 Days of Solana" Challenge? Let’s Solve It!- Hala kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Mon, 13 Jul 2026 19:36:53 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/missing-days-83-84-in-the-mlh-100-days-of-solana-challenge-lets-solve-it-hala-kabir-2pf3</link>
      <guid>https://dev.to/halakabir234hub/missing-days-83-84-in-the-mlh-100-days-of-solana-challenge-lets-solve-it-hala-kabir-2pf3</guid>
      <description>&lt;p&gt;Hey everyone! 👋&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/janvinsha"&gt;@janvinsha&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/matthewrevell"&gt;@matthewrevell&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/niranjannlc"&gt;@niranjannlc&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/walletguy"&gt;@walletguy&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/ajdroi"&gt;@ajdroi&lt;/a&gt;  &lt;a class="mentioned-user" href="https://dev.to/sammie_"&gt;@sammie_&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/binayak"&gt;@binayak&lt;/a&gt; @100daysofsolana&lt;/p&gt;

&lt;p&gt;I've been working through Major League Hacking's incredible &lt;strong&gt;100 Days of Solana&lt;/strong&gt; developer track. I recently wrapped up the previous arc at &lt;strong&gt;Day 82&lt;/strong&gt; and was super excited to continue.&lt;/p&gt;

&lt;p&gt;However, my dashboard jumped straight from &lt;strong&gt;Day 82&lt;/strong&gt; to &lt;strong&gt;Day 85&lt;/strong&gt; (&lt;a href="https://www.mlh.com/events/100-days-of-solana/challenges/019f5b90-09c3-9a0f-9241-65ee784cc401" rel="noopener noreferrer"&gt;Take an Anchor program from staging to production&lt;/a&gt;). I completely missed out on the email updates or dashboard cards for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Day 83&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Day 84&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because I want to make sure I don't miss a single step of the security, fuzzing, and deployment arc, I want to catch up on these missing links.&lt;/p&gt;

&lt;h2&gt;
  
  
  Can you help?
&lt;/h2&gt;

&lt;p&gt;If you've received the links or completed &lt;strong&gt;Day 83&lt;/strong&gt; and &lt;strong&gt;Day 84&lt;/strong&gt;, could you drop the URLs or titles of those challenges in the comments below?&lt;/p&gt;

&lt;p&gt;Also, if any MLH community organizers are around, I'd love to know if those days were intentionally skipped/merged or if my email automation just had a minor hiccup!&lt;/p&gt;

&lt;p&gt;Thanks a ton, and happy hacking! 🚀&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>The Solana CPI Field Guide: Function Calls with a Guest List - Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Sat, 11 Jul 2026 19:36:47 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/the-solana-cpi-field-guide-function-calls-with-a-guest-list-hala-kabir-16f2</link>
      <guid>https://dev.to/halakabir234hub/the-solana-cpi-field-guide-function-calls-with-a-guest-list-hala-kabir-16f2</guid>
      <description>&lt;h1&gt;
  
  
  The Solana CPI Field Guide
&lt;/h1&gt;

&lt;p&gt;Five days ago, CPI (Cross-Program Invocation) felt like a confusing wall of boilerplate code. If you are starting out, here is the exact mental model I wish someone had handed me on Day 71.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 The Mental Model: A Guest List
&lt;/h2&gt;

&lt;p&gt;Think of a CPI as a standard function call, but it requires a strict "guest list". In Solana, programs are completely stateless. When your program wants to call another program, you have to pass three specific components:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Program ID:&lt;/strong&gt; The address of the program you are calling so the runtime knows where to route the request.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Accounts:&lt;/strong&gt; A list of every account that the target program needs to read from or write to.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Authority (Signers):&lt;/strong&gt; If you are invoking on behalf of a PDA, your program must provide the original seeds to prove it has the authority to sign.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  💻 The Code
&lt;/h2&gt;

&lt;p&gt;Here is a clean, minimal layout of what a CPI to the System Program looks like in Anchor. This handles a simple lamport transfer:&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="nd"&gt;#[derive(Accounts)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;ScatterTransfer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;AccountInfo&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;execute_cpi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;ScatterTransfer&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cpi_accounts&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Transfer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;from&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.from&lt;/span&gt;&lt;span class="nf"&gt;.to_account_info&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="n"&gt;to&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.to&lt;/span&gt;&lt;span class="nf"&gt;.to_account_info&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cpi_program&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="py"&gt;.accounts.system_program&lt;/span&gt;&lt;span class="nf"&gt;.to_account_info&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;cpi_ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;CpiContext&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpi_program&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;cpi_accounts&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nn"&gt;anchor_lang&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;transfer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpi_ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚠️ What Tripped Me Up
&lt;/h2&gt;

&lt;p&gt;When working through real implementations, the runtime can feel incredibly vocal. One error that completely stalled progress was custom program error: 0xbbd (AccountNotEnoughKeys).&lt;/p&gt;

&lt;p&gt;This error happens at the physical boundary where your client and program interact. It simply means the client file failed to pass all of the required keys defined in your Anchor validation struct. When you see it, top-down validation checks are your best friend: verify that your TypeScript test structure precisely aligns with your Rust layout.&lt;/p&gt;

&lt;h2&gt;
  
  
  📚 Wrap Up
&lt;/h2&gt;

&lt;p&gt;Mastering CPIs isn't about memorizing syntax; it's about checking your constraints and verifying boundaries. For a deeper look into the low-level mechanics, check out the Solana CPI Docs and the Anchor Framework Reference.&lt;/p&gt;

&lt;p&gt;This post documents the journey across Days 71–75 of #100DaysOfSolana.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#HaveACoderfullday
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>100daysofsolana</category>
      <category>ai</category>
      <category>web3</category>
      <category>rust</category>
    </item>
    <item>
      <title>What I learned about PDAs in a week of building on Solana -Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Thu, 02 Jul 2026 20:54:48 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/what-i-learned-about-pdas-in-a-week-of-building-on-solana-hala-kabir-4fo5</link>
      <guid>https://dev.to/halakabir234hub/what-i-learned-about-pdas-in-a-week-of-building-on-solana-hala-kabir-4fo5</guid>
      <description>&lt;p&gt;&lt;strong&gt;On Solana, smart contracts (programs) are completely stateless logic engines. Unlike Web2 backends where a server holds context or modifies its own memory, a Solana program cannot store a single byte of data inside itself. If your program needs to remember an execution state—like a user's transaction count, a game state, or a global configuration—it must live in a completely separate account. Program Derived Addresses (PDAs) are the ultimate solution to this architectural requirement, providing a deterministic mechanism to locate and validate data off-chain and on-chain without maintaining a centralized registry.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;If you come from a &lt;code&gt;Web2&lt;/code&gt; or traditional relational database background, the cleanest way to think about a &lt;code&gt;PDA&lt;/code&gt; is as a deterministic database primary key computed directly from the logical identity of a row.&lt;/p&gt;

&lt;p&gt;In a SQL database, you might locate a user's profile using a compound key like &lt;code&gt;WHERE user_id = X AND table_name = 'profiles'&lt;/code&gt;. A PDA acts exactly like this compound key, hashed down into a 32-byte public key string. However, the analogy breaks in two crucial places:&lt;/p&gt;

&lt;p&gt;1.&lt;strong&gt;On-Demand Generation:&lt;/strong&gt; PDAs are not stored in a master index table anywhere on the ledger. They are derived mathematically on the fly. An address can exist cryptographically long before an actual account is initialized at that location on-chain.&lt;/p&gt;

&lt;p&gt;2.&lt;strong&gt;Program Access Monopolies:&lt;/strong&gt; The derivation layout explicitly bakes your specific Program ID into the cryptographic hash function. This guarantees that only your program can generate that exact address and sign transactions on its behalf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Anatomy of a Derivation
&lt;/h2&gt;

&lt;p&gt;Let's look at the canonical pattern from a standard Anchor counter implementation:&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="n"&gt;Rust&lt;/span&gt;
&lt;span class="nd"&gt;#[account(&lt;/span&gt;
    &lt;span class="nd"&gt;init,&lt;/span&gt;
    &lt;span class="nd"&gt;payer&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;user,&lt;/span&gt;
    &lt;span class="nd"&gt;space&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;seeds&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="err"&gt;[&lt;/span&gt;&lt;span class="s"&gt;b"counter"&lt;/span&gt;&lt;span class="nd"&gt;,&lt;/span&gt; &lt;span class="nd"&gt;user&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;key()&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="nd"&gt;as_ref()]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bump&lt;/span&gt;
&lt;span class="p"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;CounterAccount&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down exactly what Anchor is doing behind the scenes during this derivation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Static Seed Prefix (&lt;code&gt;b"counter"&lt;/code&gt;): This acts as our "table name" constraint. It ensures that this PDA space doesn't collide with other data schemas inside the same program.&lt;/li&gt;
&lt;li&gt;Dynamic Seed (&lt;code&gt;user.key().as_ref()&lt;/code&gt;): This is the unique identity component (like a user ID). It binds the resulting address directly to the caller's public key.&lt;/li&gt;
&lt;li&gt;The Program ID: While not explicitly listed in the array, Anchor implicitly injects your program's compiled ID into the derivation calculation.&lt;/li&gt;
&lt;li&gt;The Bump: This is the critical piece. Solana addresses must lie on an algebraic path called the Ed25519 curve to belong to a standard keypair wallet. PDAs, by definition, must not have a private key (otherwise someone could guess it and sign for your data). The &lt;code&gt;bump&lt;/code&gt; is a single-byte counter (starting at 255 and decrementing) that the runtime automatically calculates to push the hash completely off the Ed25519 curve.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why the Seeds Matter
&lt;/h2&gt;

&lt;p&gt;The structure of your seed array dictates your entire application's security and architecture. Consider the difference between these two seed configurations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;seeds = [b"counter", user.key().as_ref()]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;seeds = [b"counter"]&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The first configuration carves out an isolated state per user. If Wallet A and Wallet B run the derivation, they get entirely unique addresses. This is a secure per-user tracking state.&lt;/p&gt;

&lt;p&gt;The second configuration drops individual identity completely. No matter who calls the derivation, the result is the exact same public key. This is perfect for a &lt;strong&gt;Global Config Singleton&lt;/strong&gt; that regulates global program rules, but it would be a disaster for a user state, as the very first person to initialize it would block everyone else with an "Account Already In Use" error!&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Bump Buys You
&lt;/h2&gt;

&lt;p&gt;When you use Anchor's native &lt;code&gt;bump&lt;/code&gt; constraint, the system calculates the canonical bump—which is the highest starting byte value (255) that successfully knocks the address off the cryptographic curve.&lt;/p&gt;

&lt;p&gt;Anchor automatically handles storing this calculated bump into your account structure during initialization. You should always read and re-pass this stored bump value on subsequent instructions instead of calculating a new one. Re-deriving a bump on the fly forces the CPU to run a search loop which wastes compute budgets, whereas reading a stored bump from an account structure is practically free.&lt;/p&gt;

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

&lt;p&gt;A Solana PDA lifecycle moves through four clean stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Derive&lt;/strong&gt;: The client or program mathematically computes the address using seeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Initialize (&lt;code&gt;init&lt;/code&gt;):&lt;/strong&gt; The program calls the System Program, passes the required rent (a small amount of lamports deposited to keep the account alive on-chain), allocates the required space, and creates the account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutate:&lt;/strong&gt; Instructions accept the account, verify its seeds match, and alter its inner data properties (e.g., incrementing a counter).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Close:&lt;/strong&gt; When data is no longer needed, an instruction can zero out the data array and transfer all remaining lamports back to the user. On Solana, "closing" is simply an immediate rent drainage; once an account hits 0 lamports, the validators instantly flag it for garbage collection at the end of the slot.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I Would Tell Past Me
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Program IDs are hardcoded anchors:&lt;/strong&gt; The exact same seed array run on a different program ID will result in an entirely foreign address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Programs sign, not keys:&lt;/strong&gt; PDAs do not possess private keys. They can only execute actions when your specific program signs on their behalf using &lt;code&gt;invoke_signed&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Beware of &lt;code&gt;init_if_needed&lt;/code&gt;:&lt;/strong&gt; It is incredibly convenient, but it can easily hide missing logic boundaries or introduce reentrancy vulnerabilities if you don't apply tight constraints. Reach for it deliberately, not as a shortcut.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>100daysofsolana</category>
      <category>ai</category>
      <category>rust</category>
      <category>anchor</category>
    </item>
    <item>
      <title>How I Built a Counter Program in Anchor and Learned to Trust My Tests -Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Sun, 21 Jun 2026 21:38:47 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/how-i-built-a-counter-program-in-anchor-and-learned-to-trust-my-tests-hala-kabir-1743</link>
      <guid>https://dev.to/halakabir234hub/how-i-built-a-counter-program-in-anchor-and-learned-to-trust-my-tests-hala-kabir-1743</guid>
      <description>&lt;p&gt;Nothing exposes fuzzy understanding faster than trying to explain your own code. Over the last few days of the #100DaysOfSolana challenge, I’ve been building, testing, and intentionally breaking a decentralized counter program using the Anchor framework.&lt;/p&gt;

&lt;p&gt;When you're writing smart contracts on Solana, a green test suite feels great—but it can also hide silent assumptions. Today, I want to pull back the curtain on how my first Anchor program works and show exactly how I broke it on purpose to prove my test suite actually does real work.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Entry Point: Solana's Guard Rails
&lt;/h2&gt;

&lt;p&gt;The biggest paradigm shift when moving from Web2 to Solana development is how state is handled. In Solana, programs (smart contracts) are stateless; all data lives inside external accounts. To create an account, Anchor uses an accounts validation struct. Here is how my &lt;code&gt;Initialize&lt;/code&gt; struct is laid out:&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="nd"&gt;#[derive(Accounts)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(init,&lt;/span&gt; &lt;span class="nd"&gt;payer&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;authority,&lt;/span&gt; &lt;span class="nd"&gt;space&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;32&lt;/span&gt; &lt;span class="err"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(mut)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;system_program&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Program&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This struct functions as our security guard before the main logic ever runs. The &lt;code&gt;#[account(...)]&lt;/code&gt; macro tells Anchor to initialize a brand-new &lt;code&gt;counter&lt;/code&gt; account, forces the transaction &lt;code&gt;authority&lt;/code&gt; to pay the SOL storage rent, and allocates exactly enough memory space (8 bytes for the Anchor discriminator, 32 bytes for the public key, and 8 bytes for our data number).&lt;/p&gt;

&lt;h2&gt;
  
  
  Short Handlers and Iron-Clad Access Control
&lt;/h2&gt;

&lt;p&gt;Because the accounts struct handles the heavy lifting of security and allocation, our actual instruction handlers inside the &lt;code&gt;pub mod&lt;/code&gt; can be beautifully short and concise.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;ctx.accounts&lt;/code&gt; object lets us confidently unpack the validated accounts. But initialization is only half the battle. What stops a malicious actor from modifying someone else's state? This is where access control shines in our &lt;code&gt;Increment&lt;/code&gt; instruction:&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="nd"&gt;#[derive(Accounts)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Increment&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[account(mut,&lt;/span&gt; &lt;span class="nd"&gt;has_one&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;authority)]&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Account&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="n"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Signer&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nv"&gt;'info&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By adding &lt;code&gt;has_one = authority&lt;/code&gt;, Anchor automatically enforces a strict on-chain check: the key signing this transaction must match the public key permanently stored inside the &lt;code&gt;counter.authority&lt;/code&gt; field. If it doesn't, execution completely halts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proving the Tests Earn Their Keep
&lt;/h2&gt;

&lt;p&gt;To make sure this logic holds up, I wrote a test suite tracking both the happy path and critical failure states using an integrated test runner:&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="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Initializes then increments successfully&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;({...}).&lt;/span&gt;&lt;span class="nf"&gt;signers&lt;/span&gt;&lt;span class="p"&gt;([...]).&lt;/span&gt;&lt;span class="nf"&gt;rpc&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;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;({...}).&lt;/span&gt;&lt;span class="nf"&gt;signers&lt;/span&gt;&lt;span class="p"&gt;([...]).&lt;/span&gt;&lt;span class="nf"&gt;rpc&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;account&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;counterKeypair&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toNumber&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Assertion Failed!&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Why this test exists: If the runtime environment introduces a regression where state transitions fail silently or data math corrupts, this test will instantly trip.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Increment fails when the wrong authority signs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;authorityB&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="nf"&gt;signers&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;authorityB&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;rpc&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;The transaction should have failed!&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="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Caught expected authority error!&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="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Why this test exists: This isolates our access control constraint, ensuring an unauthorized user cannot maliciously modify accounts they do not own.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Turning Point: Mutation Testing
&lt;/h2&gt;

&lt;p&gt;The real magic happened when I ran a manual mutation test pass—planting bugs on purpose to see if my test suite was genuinely "load-bearing."&lt;/p&gt;

&lt;p&gt;I intentionally went into &lt;code&gt;src/lib.rs&lt;/code&gt; and broke the core arithmetic logic by updating the step increment from &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;2&lt;/code&gt;:&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="n"&gt;counter&lt;/span&gt;&lt;span class="py"&gt;.count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;counter&lt;/span&gt;&lt;span class="py"&gt;.count&lt;/span&gt;&lt;span class="nf"&gt;.checked_add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.ok_or&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;ProgramError&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;Custom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;?&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When I compiled and ran the suite, the happy path test caught it red-handed. The test framework threw a glaring red flag because it expected a value of &lt;code&gt;1&lt;/code&gt; but received a &lt;code&gt;2&lt;/code&gt; directly from the account state.&lt;/p&gt;

&lt;p&gt;This taught me a massive lesson: you can't just trust a green checkmark because your tutorial said it's correct. You only truly trust your tests when you have physically watched them break for the exact right reasons.&lt;/p&gt;

&lt;p&gt;If I had another week to build on this, my next step would be implementing dynamic PDA (Program Derived Address) counters so users could spin up unique, deterministically mapped counter states linked exclusively to their wallets.&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>rust</category>
      <category>testing</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Anchor Test failing on 0 !== 1 despite increment method being called in Solana Playground- Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Sat, 20 Jun 2026 20:11:32 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/anchor-test-failing-on-0-1-despite-increment-method-being-called-in-solana-playground-hala-5gof</link>
      <guid>https://dev.to/halakabir234hub/anchor-test-failing-on-0-1-despite-increment-method-being-called-in-solana-playground-hala-5gof</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/niranjannlc"&gt;@niranjannlc&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/walletguy"&gt;@walletguy&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/ajdroi"&gt;@ajdroi&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/matthewrevell"&gt;@matthewrevell&lt;/a&gt;  pleasee help an young develpoer..&lt;/p&gt;

&lt;p&gt;Hi everyone, I am running into a persistent issue on Solana Playground where my Anchor integration test is failing with an &lt;code&gt;AssertionError [ERR_ASSERTION]: Expected values to be strictly equal: 0 !== 1.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;My smart contract includes a functional &lt;code&gt;increment&lt;/code&gt; instruction, and my &lt;code&gt;anchor.test.ts&lt;/code&gt; file correctly initializes the account and immediately calls the increment instruction right after. The code looks like this:&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="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;counter&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="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Increments&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;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;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;AnchorProvider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;env&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setProvider&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;provider&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;program&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;workspace&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Counter&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;keypair&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;anchor&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;web3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Keypair&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;generate&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;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;initialize&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keypair&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;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wallet&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="nf"&gt;signers&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="nx"&gt;keypair&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="nf"&gt;rpc&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;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;accounts&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;keypair&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;authority&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;provider&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;wallet&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="nf"&gt;rpc&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;state&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;program&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;account&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;counter&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;keypair&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;assert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;strictEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toNumber&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What I've tried:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Re-building and re-deploying the contract successfully on Testnet.&lt;/li&gt;
&lt;li&gt;Hard-refreshing the playground browser environment.&lt;/li&gt;
&lt;li&gt;Running &lt;code&gt;test&lt;/code&gt; directly via the playground terminal console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Despite the successful deployment and complete test script execution, the fetched state counter remains &lt;code&gt;0&lt;/code&gt;. Is there a known state-caching or deployment-sync quirk within Solana Playground that prevents the transaction from reflecting on the account state during test runner execution? Any help would be greatly appreciated!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>blockchain</category>
      <category>100daysofsolana</category>
      <category>programming</category>
    </item>
    <item>
      <title>Three Token-2022 Mints in One Week: Fees, Yield, and Soul-Bound Tokens -Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Sat, 13 Jun 2026 20:53:34 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/three-token-2022-mints-in-one-week-fees-yield-and-soul-bound-tokens-hala-kabir-1f1f</link>
      <guid>https://dev.to/halakabir234hub/three-token-2022-mints-in-one-week-fees-yield-and-soul-bound-tokens-hala-kabir-1f1f</guid>
      <description>&lt;p&gt;If you are coming from a Web2 background, adding custom behavior to a digital asset usually means writing complex application middleware, hacking core database schemas, or riskily altering base-layer logic. On Solana, things are completely different. Token-2022—the upgraded SPL (Solana Program Library) token standard—introduces Token Extensions.&lt;/p&gt;

&lt;p&gt;Think of extensions as secure, native, plug-and-play middleware built directly into the blockchain's core layout. Instead of rewriting or auditing custom smart contracts, developers can opt into complex behaviors like native transaction taxes, automatic dynamic yield displays, or permanent transfer locks right at the mint's creation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This past week, during my 100 Days of Solana challenge, I went into the trenches with Token-2022 to ship three distinct mints on devnet. Here is the exact breakdown of what I built, the terminal history behind them, and when you should reach for these extensions in production.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Revenue Driver: Transfer Fees
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Extension&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Extension Used:&lt;/strong&gt; &lt;code&gt;TransferFeeConfig&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Devnet Mint Address:&lt;/strong&gt; &lt;code&gt;HPjCRBKC2nhWwrK8ZoZtv6cdTXv3pbHP6b9ndgqvXtDG&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Solana Explorer Link:&lt;/strong&gt; &lt;a href="https://explorer.solana.com/address/HPjCRBKC2nhWwrK8ZoZtv6cdTXv3pbHP6b9ndgqvXtDG?cluster=devnet" rel="noopener noreferrer"&gt;View on Solana Explorer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Command&lt;/strong&gt;&lt;br&gt;
To spin up a token that automatically skims a 1% fee on every single wallet-to-wallet transfer (capped at a maximum of 5,000 whole tokens), &lt;strong&gt;I ran this in my terminal on Day 50:&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;&lt;span class="c"&gt;# Create Token-2022 mint with a 1% transfer fee (100 basis points) and a cap of 5,000 tokens&lt;/span&gt;
spl-token create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--decimals&lt;/span&gt; 9 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-basis-points&lt;/span&gt; 100 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--transfer-fee-maximum-fee&lt;/span&gt; 5000000000000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gotcha Warning: The &lt;code&gt;--transfer-fee-maximum-fee&lt;/code&gt; flag expects the amount in base units (lamports-equivalent for tokens). Because I set &lt;code&gt;--decimals 9&lt;/code&gt;, I had to multiply my desired &lt;strong&gt;5,000 token cap by 10 9 (&lt;code&gt;5000000000000&lt;/code&gt;)&lt;/strong&gt;so it didn't *&lt;em&gt;accidentally *&lt;/em&gt; cap my fees at a tiny fraction of a token!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When to Reach for It&lt;/strong&gt;&lt;br&gt;
This extension lets you hardcode business economics directly into the asset. You would use this to build &lt;strong&gt;sustainable creator royalties&lt;/strong&gt; on community tokens, automate a continuous protocol revenue skim on stablecoins, or fund a &lt;strong&gt;decentralized autonomous organization (DAO)&lt;/strong&gt; treasury directly through user transaction volume without relying on third-party marketplace compliance.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. The Multi-Extension Heavyweight: Hybrid Interest-Bearing &amp;amp; Fee Mint
&lt;/h2&gt;

&lt;p&gt;The Extension&lt;br&gt;
Extensions Combined: &lt;code&gt;InterestBearingConfig&lt;/code&gt; + &lt;code&gt;TransferFeeConfig&lt;/code&gt;&lt;br&gt;
Devnet Mint Address: &lt;code&gt;F1Xf67zwZnZzBjQ18fHtaEfJ6yzq6iGatNWvT9n5BgcJ&lt;/code&gt;&lt;br&gt;
Solana Explorer Link: &lt;a href="https://explorer.solana.com/address/F1Xf67zwZnZzBjQ18fHtaEfJ6yzq6iGatNWvT9n5BgcJ?cluster=devnet" rel="noopener noreferrer"&gt;View on Solana Explorer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture (&lt;code&gt;client.ts&lt;/code&gt;)&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;On Day 52,&lt;/strong&gt; I wanted to see how far I could push Token-2022 by stacking extensions together. Instead of running basic CLI commands, I wrote a custom programmatic script in TypeScript (&lt;code&gt;client.ts&lt;/code&gt;) to initialize a single Hybrid Mint that accumulates interest while simultaneously enforcing transfer fees.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The script successfully executed the entire transaction lifecycle on Devnet:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Created the hybrid mint address and associated token accounts.&lt;/li&gt;
&lt;li&gt;Took an initial UI snapshot showing exactly &lt;code&gt;1000000&lt;/code&gt;tokens.&lt;/li&gt;
&lt;li&gt;Paused script execution for 15 seconds to allow on-chain interest to compound natively.&lt;/li&gt;
&lt;li&gt;Logged a post-pause UI balance increase to &lt;code&gt;1000000.237667&lt;/code&gt; entirely from holding!&lt;/li&gt;
&lt;li&gt;Transferred 1,000 tokens to a recipient wallet, automatically holding back the transfer fee.&lt;/li&gt;
&lt;li&gt;Ran a&lt;code&gt;FEE SWEEP&lt;/code&gt;command to harvest the withheld fees back to the primary wallet authority.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Hard Truth About Native Yield&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here is the subtle architectural distinction that will save future readers hours of debugging: The interest-bearing extension does not mint new supply or change your underlying raw balance state. Instead, it modifies the displayed UI amount across wallets and block explorers using an on-chain timestamp formula relative to network time. The raw amount inside your token account remains exactly the same, but the network calculates and updates what the user sees in real-time. It’s perfect for visual, UI-driven yield tracking without the inflation or gas overhead of continuous minting transactions.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. The Unbreakable Link: Non-Transferable (Soulbound) Tokens
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Extension&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extension Used: &lt;code&gt;NonTransferable&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Devnet Mint Address: &lt;code&gt;HZUuPaia9C4aHZ3W9sp31sM56FF6pYK8dPYwbgwbWht&lt;/code&gt;K&lt;/li&gt;
&lt;li&gt;Solana Explorer Link: &lt;a href="https://explorer.solana.com/address/HZUuPaia9C4aHZ3W9sp31sM56FF6pYK8dPYwbgwbWhtK?cluster=devnet" rel="noopener noreferrer"&gt;View on Solana Explorer&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Command&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Finally, on Day 54,&lt;/strong&gt; I built a token designed to act as a permanent badge of honor that absolutely** refuses to leave the wallet it’s delivered to:**&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;# Initialize a soul-bound mint that locks tokens permanently to the recipient&lt;/span&gt;
spl-token create-token &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--program-id&lt;/span&gt; TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--decimals&lt;/span&gt; 0 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--enable-non-transferable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The Reality of Runtime Rejection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To ensure the validator network was strictly locking down this asset, I intentionally forced a standard &lt;code&gt;spl-token transfer&lt;/code&gt; to a secondary wallet. The runtime didn't just quietly ignore it—it shut down the simulation instantly. M*&lt;em&gt;y terminal logged this exact raw program failure:&lt;/em&gt;*&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Client error: Faulty transaction: Transaction simulation failed: Error processing Instruction 0: custom program error: 0x12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Seeing &lt;code&gt;custom program error: 0x12&lt;/code&gt; (the hex representation of the Token-2022 program's native &lt;code&gt;CannotTransferNonTransferableToken&lt;/code&gt; error) proved that this constraint is absolute. It is enforced natively at the protocol level, making it completely impossible for bad actors or unaligned UIs to bypass the transfer restriction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Reflection
&lt;/h2&gt;

&lt;p&gt;_What surprised me most about this arc was how beautifully clean the development flow is. If you tried to combine transfer fees, UI-driven interest modifiers, and soulbound transfer locks in an EVM environment, you’d be stuck writing, testing, and auditing hundreds of lines of custom Solidity code. Token-2022 shifts the paradigm entirely: complex, production-grade token mechanics are now treated as simple initialization configurations or clean TypeScript extension vectors rather than high-stakes custom software engineering.&lt;/p&gt;

&lt;p&gt;By standardizing these patterns directly within the network, Solana makes it incredibly safe and straightforward to combine these primitives for real-world assets, institutional compliance tokens, and tamper-proof digital credentials._&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#Have a coderfull day!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>100daysofsolana</category>
      <category>solana</category>
      <category>web3</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Needing Help for Missing 100 Days of Solana challenge -Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:20:21 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/needing-help-for-missing-100-days-of-solana-challenge-hala-kabir-5566</link>
      <guid>https://dev.to/halakabir234hub/needing-help-for-missing-100-days-of-solana-challenge-hala-kabir-5566</guid>
      <description>&lt;p&gt;&lt;strong&gt;&lt;a class="mentioned-user" href="https://dev.to/niranjannlc"&gt;@niranjannlc&lt;/a&gt; &amp;amp; &lt;a class="mentioned-user" href="https://dev.to/matthewrevell"&gt;@matthewrevell&lt;/a&gt; please can you help or ask somone for help ....&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hi everyone,&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I need some help regarding the 100 Days of Solana challenge.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;I completed Day 46 and Day 47, but the next email I received was Day 50. I didn't receive any emails for the days in between. I also remember something similar happening earlier where I never received Day 35.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Could someone please check if they received:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Day 48&lt;/li&gt;
&lt;li&gt;Day 49&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;If you did receive them, could you let me know whether those days actually exist in the email sequence?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And if possible, would you be willing to share the challenge links or forward the exact emails to me? I don't want to miss any lessons or fall behind because of missing emails.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thanks a lot for any help!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>100daysofsolana</category>
      <category>ai</category>
      <category>webdev</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>Testers Needed For My First Google Playstore App -Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Wed, 03 Jun 2026 00:45:50 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/testers-needed-for-my-first-google-playstore-app-hala-kabir-4i2m</link>
      <guid>https://dev.to/halakabir234hub/testers-needed-for-my-first-google-playstore-app-hala-kabir-4i2m</guid>
      <description>&lt;p&gt;&lt;a class="mentioned-user" href="https://dev.to/janvinsha"&gt;@janvinsha&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/niranjannlc"&gt;@niranjannlc&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/matthewrevell"&gt;@matthewrevell&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/sammie_"&gt;@sammie_&lt;/a&gt; &lt;a class="mentioned-user" href="https://dev.to/rieljdev"&gt;@rieljdev&lt;/a&gt; &lt;strong&gt;I will apriciate it soo much.....&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;🚀 EcoQuantum Solution Beta Testing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Join our testing group&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://groups.google.com/g/ecoquantum-beta-testers" rel="noopener noreferrer"&gt;Join the group Here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Become a beta tester&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://play.google.com/apps/testing/com.ecoquantum.solution" rel="noopener noreferrer"&gt;Download here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Install the app from Play Store and test it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share Screen shot too after downloading &lt;br&gt;
Please keep the app installed for 14 days and share feedback spent 2 mins daily on app 💚.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;If any Problem please tag me in a post @halakabir234hub please, coment your problem or Email Me halakabir234@gmail.com&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;#Have A coderfull Day &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Building Production-Ready DAO Platforms: Lessons from Reviewing a Full-Stack Web3 Application By Hala Kabir</title>
      <dc:creator>Hala Kabir</dc:creator>
      <pubDate>Tue, 02 Jun 2026 22:29:35 +0000</pubDate>
      <link>https://dev.to/halakabir234hub/building-production-ready-dao-platforms-lessons-from-reviewing-a-full-stack-web3-application-by-2jge</link>
      <guid>https://dev.to/halakabir234hub/building-production-ready-dao-platforms-lessons-from-reviewing-a-full-stack-web3-application-by-2jge</guid>
      <description>&lt;p&gt;The blockchain industry has evolved far beyond simple token transfers and NFT marketplaces. Modern decentralized applications increasingly require sophisticated architectures that combine frontend experiences, backend services, databases, and smart contract interactions.&lt;/p&gt;

&lt;p&gt;Recently, I reviewed a DAO-style Web3 platform built using Next.js, Node.js, MongoDB, and blockchain integrations. The experience reinforced several important lessons about what it takes to build production-ready decentralized applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why DAO Platforms Are Technically Challenging
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;At first glance, a DAO appears straightforward:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;* Users connect a wallet&lt;/li&gt;
&lt;li&gt;* Members create proposals&lt;/li&gt;
&lt;li&gt;* Token holders vote&lt;/li&gt;
&lt;li&gt;* Smart contracts execute outcomes&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;However, production systems are significantly more complex.&lt;/p&gt;

&lt;p&gt;A complete DAO platform must coordinate multiple layers:&lt;/p&gt;

&lt;h2&gt;
  
  
  Frontend Layer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The user interface is responsible for:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;* Wallet connection&lt;/li&gt;
&lt;li&gt;* Transaction signing&lt;/li&gt;
&lt;li&gt;* Governance dashboards&lt;/li&gt;
&lt;li&gt;* Proposal management&lt;/li&gt;
&lt;li&gt;* Voting interfaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Frameworks such as Next.js provide a strong foundation for building responsive and scalable user experiences.&lt;/p&gt;

&lt;h2&gt;
  
  
  Backend Layer
&lt;/h2&gt;

&lt;p&gt;Many newcomers assume DAO platforms are entirely on-chain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In reality, backend systems often handle:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;* Proposal metadata&lt;/li&gt;
&lt;li&gt;* Analytics&lt;/li&gt;
&lt;li&gt;* Notifications&lt;/li&gt;
&lt;li&gt;* Caching&lt;/li&gt;
&lt;li&gt;* User activity tracking&lt;/li&gt;
&lt;li&gt;* Search functionality&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Node.js remains a popular choice due to its flexibility and strong ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blockchain Layer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The blockchain serves as the source of truth for:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;* Proposal creation&lt;/li&gt;
&lt;li&gt;* Voting outcomes&lt;/li&gt;
&lt;li&gt;* Treasury actions&lt;/li&gt;
&lt;li&gt;* Governance execution&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This layer introduces unique challenges related to transaction reliability, gas optimization, and security.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of On-Chain and Off-Chain Synchronization
&lt;/h2&gt;

&lt;p&gt;One of the most critical architectural concerns is maintaining consistency between blockchain state and application state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A common pattern involves:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Smart contracts emit events.&lt;/li&gt;
&lt;li&gt;Backend services listen to those events.&lt;/li&gt;
&lt;li&gt;Database records are updated.&lt;/li&gt;
&lt;li&gt;Frontend applications display synchronized information.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Without proper synchronization mechanisms, users may encounter:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;* Incorrect vote counts&lt;/li&gt;
&lt;li&gt;* Stale governance data&lt;/li&gt;
&lt;li&gt;* Delayed proposal updates&lt;/li&gt;
&lt;li&gt;* Inconsistent treasury information&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is often where mature Web3 systems distinguish themselves from early-stage prototypes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wallet UX Matters More Than Most Teams Expect
&lt;/h2&gt;

&lt;p&gt;Many Web3 projects focus heavily on protocol design while underestimating user experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A governance platform can have excellent smart contracts and still fail if users experience:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;* Confusing transaction prompts&lt;/li&gt;
&lt;li&gt;* Failed signatures&lt;/li&gt;
&lt;li&gt;* Unclear voting confirmations&lt;/li&gt;
&lt;li&gt;* Slow state updates&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Improving wallet interactions directly improves trust and adoption.&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Risks Every DAO Team Should Monitor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Several risks consistently appear across DAO implementations:&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Synchronization Failures
&lt;/h2&gt;

&lt;p&gt;Blockchain events must be processed reliably to avoid inconsistent state.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Governance Abuse
&lt;/h2&gt;

&lt;p&gt;Voting systems should protect against manipulation and proposal spam.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Backend Reliability
&lt;/h2&gt;

&lt;p&gt;Even decentralized systems depend on reliable APIs, databases, and monitoring.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Security
&lt;/h2&gt;

&lt;p&gt;Treasury management, permissions, and contract execution require continuous review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Would Prioritize in an MVP
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;For an early-stage DAO platform, I would prioritize:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stable wallet integration&lt;/li&gt;
&lt;li&gt;Reliable proposal creation workflows&lt;/li&gt;
&lt;li&gt;Accurate voting mechanisms&lt;/li&gt;
&lt;li&gt;Event synchronization infrastructure&lt;/li&gt;
&lt;li&gt;Monitoring and observability&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These features establish trust before scaling into more advanced governance capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Web3 engineering is increasingly becoming a systems engineering discipline.&lt;/p&gt;

&lt;p&gt;Success no longer depends solely on writing smart contracts. Teams must build reliable interactions between frontend applications, backend services, databases, and blockchain infrastructure.&lt;/p&gt;

&lt;p&gt;The future of DAO platforms will belong to teams that can balance decentralization, usability, security, and operational excellence.&lt;/p&gt;

&lt;p&gt;As I continue exploring DAO infrastructure, Solana development, and full-stack Web3 architecture, I'm excited by the opportunities that lie ahead for builders who can bridge these worlds effectively.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>ai</category>
      <category>programming</category>
      <category>100daysofsolana</category>
    </item>
  </channel>
</rss>
