<?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: Amir of Ekiti</title>
    <description>The latest articles on DEV Community by Amir of Ekiti (@amirofekiti).</description>
    <link>https://dev.to/amirofekiti</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%2F1124116%2F184ead2e-e402-4dda-ac52-9324b5a73c53.jpeg</url>
      <title>DEV Community: Amir of Ekiti</title>
      <link>https://dev.to/amirofekiti</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/amirofekiti"/>
    <language>en</language>
    <item>
      <title># Web3 Dev Is Not Hard — It’s Just Different</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Tue, 08 Jul 2025 19:23:26 +0000</pubDate>
      <link>https://dev.to/amirofekiti/-web3-dev-is-not-hard-its-just-different-300c</link>
      <guid>https://dev.to/amirofekiti/-web3-dev-is-not-hard-its-just-different-300c</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;“It’s not that Web3 is hard. It’s just that everything you think you know — changes.”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  💭 The Misconception
&lt;/h2&gt;

&lt;p&gt;When I first dipped into Web3, I thought I needed to unlearn everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity looked strange
&lt;/li&gt;
&lt;li&gt;Wallets felt clunky
&lt;/li&gt;
&lt;li&gt;Testing was painful
&lt;/li&gt;
&lt;li&gt;And don’t get me started on &lt;code&gt;uint256&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But the truth is: &lt;strong&gt;Web3 development isn’t hard. It’s just... different.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
And once you stop comparing it directly to Web2, it actually becomes exciting.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 What’s Actually Different?
&lt;/h2&gt;

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




&lt;h3&gt;
  
  
  1. &lt;strong&gt;No Backend? Wrong — the Backend is the Blockchain&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In Web2, the backend is your server or cloud stack.&lt;br&gt;&lt;br&gt;
In Web3, &lt;strong&gt;the smart contract is your backend&lt;/strong&gt; — deployed on Ethereum, Polygon, etc.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You can’t patch code (unless you build for upgrades)
&lt;/li&gt;
&lt;li&gt;Everything is public
&lt;/li&gt;
&lt;li&gt;Every state change costs gas
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ You don’t write to a database — you write to an immutable ledger.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. &lt;strong&gt;Frontend Stays Familiar — But Needs to Be Wallet-Aware&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Your React/Vue app still works. You still use JavaScript.&lt;/p&gt;

&lt;p&gt;The difference?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don’t log in — you connect a wallet
&lt;/li&gt;
&lt;li&gt;You don’t call an API — you call a smart contract
&lt;/li&gt;
&lt;li&gt;You don’t store state off-chain — you &lt;em&gt;watch&lt;/em&gt; the chain for changes
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Learning libraries like &lt;code&gt;ethers.js&lt;/code&gt;, &lt;code&gt;viem&lt;/code&gt;, or &lt;code&gt;wagmi&lt;/code&gt; bridges the gap.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. &lt;strong&gt;Testing Is Less "Unit", More "Chain Simulation"&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Forget mocking a function call.&lt;br&gt;&lt;br&gt;
In Web3, you want to simulate real transactions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Will this revert?&lt;/li&gt;
&lt;li&gt;How much gas will this use?&lt;/li&gt;
&lt;li&gt;Does it behave differently when called from another contract?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tools like &lt;strong&gt;Hardhat&lt;/strong&gt;, &lt;strong&gt;Foundry&lt;/strong&gt;, and &lt;strong&gt;Tenderly&lt;/strong&gt; help answer these.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. &lt;strong&gt;You Can’t Hide Your Mistakes&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;There’s no &lt;code&gt;console.log&lt;/code&gt; in Solidity (well… kind of).&lt;br&gt;&lt;br&gt;
Every mistake you deploy is public, permanent, and traceable.&lt;/p&gt;

&lt;p&gt;But that’s also empowering.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You write contracts that live forever
&lt;/li&gt;
&lt;li&gt;Others can build on them
&lt;/li&gt;
&lt;li&gt;Users own their data
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It forces you to &lt;strong&gt;build like you mean it&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What Helped Me Transition
&lt;/h2&gt;

&lt;p&gt;Here’s what clicked for me as I went from Web2 to Web3:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start simple: deploy a &lt;code&gt;HelloWorld.sol&lt;/code&gt; to Sepolia
&lt;/li&gt;
&lt;li&gt;Learn how to read/write contract state from a frontend
&lt;/li&gt;
&lt;li&gt;Don’t chase DeFi complexity — focus on how the chain works
&lt;/li&gt;
&lt;li&gt;Use testnets like they’re real. Simulate flows, not just function calls
&lt;/li&gt;
&lt;li&gt;Get curious: inspect contracts on Etherscan, decode ABI, watch logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And the biggest mindset shift?&lt;/p&gt;

&lt;p&gt;💡 &lt;strong&gt;You’re not just writing code — you’re publishing logic into the world.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 So, Is Web3 Dev Hard?
&lt;/h2&gt;

&lt;p&gt;No.&lt;/p&gt;

&lt;p&gt;But it’s &lt;strong&gt;unforgiving&lt;/strong&gt;, &lt;strong&gt;transparent&lt;/strong&gt;, and &lt;strong&gt;trustless by design&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;And once you embrace that…&lt;br&gt;&lt;br&gt;
You realize how fun, fast, and full of potential it is to build for the chain.&lt;/p&gt;




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

&lt;p&gt;If you're a Web2 dev making the jump to Web3:&lt;br&gt;&lt;br&gt;
What confused you at first?&lt;br&gt;&lt;br&gt;
What helped you finally “get it”?&lt;/p&gt;

&lt;p&gt;Drop your thoughts in the comments — let’s help each other build better, together.&lt;/p&gt;




&lt;p&gt;Thanks for reading 🙌&lt;br&gt;&lt;br&gt;
Follow me for more Web3 dev insights, beginner-friendly smart contract tips, and honest lessons from the chain.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>web3</category>
      <category>beginners</category>
      <category>blockchain</category>
    </item>
    <item>
      <title># Why Your First DApp Should Be Boring (and What Mine Taught Me About Blockchain Reality)</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Tue, 08 Jul 2025 14:30:22 +0000</pubDate>
      <link>https://dev.to/amirofekiti/-why-your-first-dapp-should-be-boring-and-what-mine-taught-me-about-blockchain-reality-4ddj</link>
      <guid>https://dev.to/amirofekiti/-why-your-first-dapp-should-be-boring-and-what-mine-taught-me-about-blockchain-reality-4ddj</guid>
      <description>&lt;p&gt;When I built my first decentralized app, I had visions of disrupting DeFi, scaling NFTs, and maybe even minting the next viral meme token.&lt;/p&gt;

&lt;p&gt;Instead, I built... a simple "read/write" contract that stored notes on-chain.&lt;/p&gt;

&lt;p&gt;And it was the smartest decision I could’ve made.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚧 Chasing Complexity (Too Early)
&lt;/h2&gt;

&lt;p&gt;Before I understood Solidity properly, I was already sketching ideas for lending protocols and on-chain games. But something kept nagging at me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How do contracts store data long term?&lt;/li&gt;
&lt;li&gt;What happens if a write fails?&lt;/li&gt;
&lt;li&gt;How do I debug transactions after they succeed but don’t behave as expected?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The more I experimented, the more I realized I was skipping the basics.&lt;/p&gt;

&lt;p&gt;So I did something "boring."&lt;/p&gt;




&lt;h2&gt;
  
  
  📝 The DApp That Just Stored Notes
&lt;/h2&gt;

&lt;p&gt;I built a minimal dApp that did exactly two things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;addNote(string memory content)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;getNotes()&lt;/code&gt; returns a list of notes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each note was tied to &lt;code&gt;msg.sender&lt;/code&gt;. Just text — no tokens, no randomness, no cross-chain hype.&lt;/p&gt;

&lt;p&gt;But this boring dApp taught me &lt;strong&gt;everything&lt;/strong&gt; I needed to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How contract storage works
&lt;/li&gt;
&lt;li&gt;How to handle mappings and arrays
&lt;/li&gt;
&lt;li&gt;Why gas costs matter
&lt;/li&gt;
&lt;li&gt;How to emit logs for frontends
&lt;/li&gt;
&lt;li&gt;How to test using Sepolia and Hardhat
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 What I Learned (That You Probably Won’t Get From Tutorials)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Solidity is deceptively simple
&lt;/h3&gt;

&lt;p&gt;It looks like JavaScript. But one wrong storage pattern can wreck your gas costs or leave your data permanently stuck.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Gas fees matter
&lt;/h3&gt;

&lt;p&gt;Even with just notes, writing to storage is expensive. I optimized my code after seeing a 3x gas difference between versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Logs are your best friend
&lt;/h3&gt;

&lt;p&gt;Return values can’t be tracked after a tx — only events show what actually happened.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Simplicity = speed of learning
&lt;/h3&gt;

&lt;p&gt;Because the app was small, I iterated faster, caught bugs early, and deployed to mainnet with confidence.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 My Advice: Keep It Boring
&lt;/h2&gt;

&lt;p&gt;If you're building your first dApp, try something simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A to-do list
&lt;/li&gt;
&lt;li&gt;A URL shortener
&lt;/li&gt;
&lt;li&gt;A basic registry
&lt;/li&gt;
&lt;li&gt;A voting system without tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Focus on &lt;strong&gt;data storage&lt;/strong&gt;, &lt;strong&gt;permissions&lt;/strong&gt;, &lt;strong&gt;events&lt;/strong&gt;, and &lt;strong&gt;deployment flow&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Learn the mechanics — not the hype.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What’s Next?
&lt;/h2&gt;

&lt;p&gt;Now that I’ve got the basics locked in, I’m building toward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgradeable contracts
&lt;/li&gt;
&lt;li&gt;Modular smart contracts with Diamond pattern
&lt;/li&gt;
&lt;li&gt;Cross-chain message passing
&lt;/li&gt;
&lt;li&gt;Real-time indexing with The Graph
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But I wouldn’t have gotten here without starting boring.&lt;/p&gt;




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

&lt;p&gt;What was your first smart contract like?&lt;br&gt;&lt;br&gt;
Did you over-engineer it, or keep it lean?&lt;br&gt;&lt;br&gt;
What’s the best “boring” dApp idea you’d recommend to someone new?&lt;/p&gt;

&lt;p&gt;Drop a comment — let’s help newcomers build smarter from day one.&lt;/p&gt;




&lt;p&gt;Thanks for reading. Follow me for more Web3 dev stories, code, and honest lessons from building on-chain.&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>solidity</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>I Lost $200 Deploying My First Smart Contract — Lessons From a Project Fund Tracker</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Tue, 08 Jul 2025 14:23:14 +0000</pubDate>
      <link>https://dev.to/amirofekiti/i-lost-200-deploying-my-first-smart-contract-lessons-from-a-project-fund-tracker-4e8b</link>
      <guid>https://dev.to/amirofekiti/i-lost-200-deploying-my-first-smart-contract-lessons-from-a-project-fund-tracker-4e8b</guid>
      <description>&lt;h2&gt;
  
  
  🚀 My First Web3 Project: A Fund Tracker
&lt;/h2&gt;

&lt;p&gt;Like many developers getting into Web3, I wanted my first project to be more than just a “Hello, Blockchain.” I wanted something useful — something that mimicked real-world use cases.&lt;/p&gt;

&lt;p&gt;So I built a &lt;strong&gt;Project Fund Tracker&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The idea was simple: contributors could fund a project, and the owner could view and manage the funds. A lightweight version of a crowdfunding contract. It tracked contributions and allowed visibility into total funds collected.&lt;/p&gt;

&lt;p&gt;Here’s a basic version of the &lt;code&gt;contribute()&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function contribute() public payable {
    require(msg.value &amp;gt; 0, "No funds sent");
    contributions[msg.sender] += msg.value;
    totalFunds += msg.value;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything worked fine:&lt;br&gt;&lt;br&gt;
✅ Contract deployed&lt;br&gt;&lt;br&gt;
✅ Contributions received&lt;br&gt;&lt;br&gt;
✅ State updated&lt;br&gt;&lt;br&gt;
✅ Event logs emitted&lt;/p&gt;

&lt;p&gt;Feeling confident — maybe too confident — I decided it was time to go live. I deployed the same contract to &lt;strong&gt;Ethereum mainnet&lt;/strong&gt; and sent &lt;strong&gt;0.1 ETH (~$200)&lt;/strong&gt; to the &lt;code&gt;contribute()&lt;/code&gt; function.&lt;/p&gt;

&lt;p&gt;That’s when things broke.&lt;/p&gt;


&lt;h2&gt;
  
  
  😬 The $200 Mistake
&lt;/h2&gt;

&lt;p&gt;After sending the funds, I checked the contract state.&lt;/p&gt;

&lt;p&gt;Nothing had changed.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;contributions[msg.sender]&lt;/code&gt; was still &lt;code&gt;0&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;totalFunds&lt;/code&gt; hadn’t increased&lt;/li&gt;
&lt;li&gt;No events were emitted&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The transaction was marked as &lt;strong&gt;successful&lt;/strong&gt; on Etherscan. Gas was used. ETH was sent.&lt;/p&gt;

&lt;p&gt;But it was as if the contract just… ignored it.&lt;/p&gt;


&lt;h2&gt;
  
  
  🕵️‍♂️ The Debugging Journey
&lt;/h2&gt;

&lt;p&gt;I started retracing my steps.&lt;/p&gt;

&lt;p&gt;Here’s what I found:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;During a late refactor, I updated the &lt;strong&gt;constructor&lt;/strong&gt; to include default project data like title and owner.&lt;/li&gt;
&lt;li&gt;Without realizing it, I also &lt;strong&gt;reset &lt;code&gt;totalFunds&lt;/code&gt; to zero&lt;/strong&gt; and unintentionally cleared contribution mappings — right after deployment.&lt;/li&gt;
&lt;li&gt;On &lt;strong&gt;Sepolia&lt;/strong&gt;, I had been testing &lt;code&gt;contribute()&lt;/code&gt; after the contract had been used a bit. On mainnet, I interacted with it immediately post-deployment, triggering the buggy initialization.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So when I sent ETH, it went in — but the logic to track and emit contribution data was broken. And since I didn’t simulate the full flow on mainnet, I didn’t catch it beforehand.&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 Lessons Learned
&lt;/h2&gt;


&lt;h3&gt;
  
  
  🧪 Sepolia ≠ Mainnet
&lt;/h3&gt;

&lt;p&gt;Testnets are amazing — especially Sepolia. But they don’t simulate &lt;strong&gt;everything&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gas behavior&lt;/li&gt;
&lt;li&gt;Timing issues&lt;/li&gt;
&lt;li&gt;Real asset risk&lt;/li&gt;
&lt;li&gt;Behavioral quirks post-deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;From now on, I always assume mainnet = production. Period.&lt;/p&gt;


&lt;h3&gt;
  
  
  🔍 Simulate Everything
&lt;/h3&gt;

&lt;p&gt;Tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tenderly.co/" rel="noopener noreferrer"&gt;Tenderly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hardhat’s &lt;code&gt;console.log&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://book.getfoundry.sh/" rel="noopener noreferrer"&gt;Foundry’s &lt;code&gt;cast call&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…help you simulate transactions and get a dry-run view of what will &lt;em&gt;really&lt;/em&gt; happen.&lt;/p&gt;

&lt;p&gt;I didn’t simulate the &lt;code&gt;contribute()&lt;/code&gt; call after mainnet deployment. If I had, I would’ve caught the problem.&lt;/p&gt;


&lt;h3&gt;
  
  
  📦 Constructors Can Be Dangerous
&lt;/h3&gt;

&lt;p&gt;The mistake was in the &lt;strong&gt;constructor logic&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I hardcoded state initialization in the constructor, assuming it would only run once. It did — but the logic was flawed.&lt;/p&gt;

&lt;p&gt;Lesson: treat constructor logic with the same level of scrutiny as any public function. Better yet, use &lt;code&gt;initialize()&lt;/code&gt; patterns for safety and transparency.&lt;/p&gt;


&lt;h3&gt;
  
  
  📉 Emit Logs, Always
&lt;/h3&gt;

&lt;p&gt;Without events, debugging a live contract is like looking for a black cat in a dark room.&lt;/p&gt;

&lt;p&gt;I added an event later:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;event ContributionReceived(address indexed contributor, uint256 amount);

function contribute() public payable {
    require(msg.value &amp;gt; 0, "No funds sent");

    contributions[msg.sender] += msg.value;
    totalFunds += msg.value;

    emit ContributionReceived(msg.sender, msg.value);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without this, it’s hard to know if a function ran or silently failed. In my case, the lack of logs made it harder to debug what actually happened. The transaction succeeded, gas was consumed, but there was no on-chain evidence of execution — no events, no state changes, nothing obvious to inspect.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Sepolia ≠ Mainnet
&lt;/h2&gt;

&lt;p&gt;Sepolia is a great testnet, but it’s not the mainnet. While Sepolia helped me catch most bugs, it didn't replicate all real-world conditions.&lt;/p&gt;

&lt;p&gt;Mainnet differs in many ways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gas prices fluctuate much more drastically
&lt;/li&gt;
&lt;li&gt;Miner behavior can affect transaction ordering
&lt;/li&gt;
&lt;li&gt;Edge cases often appear only in live environments
&lt;/li&gt;
&lt;li&gt;Stakes are higher — real money is involved
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means &lt;strong&gt;passing tests on Sepolia doesn’t guarantee mainnet success&lt;/strong&gt;. You must simulate mainnet conditions as closely as possible.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ The Comeback
&lt;/h2&gt;

&lt;p&gt;After tracking down the issue — mainly an overlooked state reset in the constructor — I:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Refactored the constructor to avoid resetting critical state variables
&lt;/li&gt;
&lt;li&gt;Added thorough event logging to every public function
&lt;/li&gt;
&lt;li&gt;Created comprehensive test flows simulating real user interactions on Sepolia
&lt;/li&gt;
&lt;li&gt;Used simulation tools like &lt;a href="https://tenderly.co" rel="noopener noreferrer"&gt;Tenderly&lt;/a&gt; to analyze transaction behavior
&lt;/li&gt;
&lt;li&gt;Tested redeployments with a low-balance burner wallet on mainnet
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these safeguards in place, I redeployed to mainnet and finally saw:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Contributions correctly recorded
&lt;/li&gt;
&lt;li&gt;Event logs emitted as expected
&lt;/li&gt;
&lt;li&gt;No unexpected state resets or silent failures
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This time, the contract worked flawlessly.&lt;/p&gt;




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

&lt;p&gt;Deploying smart contracts to mainnet is like launching a high-stakes product. Mistakes cost real money and trust.&lt;/p&gt;

&lt;p&gt;My key takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Don’t blindly trust testnets — simulate mainnet conditions as much as possible
&lt;/li&gt;
&lt;li&gt;Use tools to simulate and debug transactions before spending gas
&lt;/li&gt;
&lt;li&gt;Treat constructor logic with extra caution
&lt;/li&gt;
&lt;li&gt;Emit detailed events for every state-changing function
&lt;/li&gt;
&lt;li&gt;Test entire interaction flows, not just isolated functions
&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Have you ever deployed a contract that worked on testnet but failed on mainnet? Made costly mistakes or discovered helpful tools?&lt;/p&gt;

&lt;p&gt;Share your story in the comments — learning from each other helps us all build better, safer Web3 apps.&lt;/p&gt;




&lt;p&gt;Thanks for reading! 🙌&lt;br&gt;&lt;br&gt;
If you found this post helpful, please ❤️ or share it with fellow Web3 developers. More stories and lessons coming soon!&lt;/p&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>learning</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>## What Really Happens When You Call a Smart Contract?</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Sat, 05 Jul 2025 02:56:45 +0000</pubDate>
      <link>https://dev.to/amirofekiti/-what-really-happens-when-you-call-a-smart-contract-33n2</link>
      <guid>https://dev.to/amirofekiti/-what-really-happens-when-you-call-a-smart-contract-33n2</guid>
      <description>&lt;p&gt;It was 2 AM. I had just deployed my first Solidity smart contract—a simple “wave at me” dApp—and was proudly calling &lt;code&gt;wave()&lt;/code&gt; from my frontend. But nothing happened.&lt;/p&gt;

&lt;p&gt;No wave.&lt;/p&gt;

&lt;p&gt;No confirmation.&lt;/p&gt;

&lt;p&gt;Just a pending transaction and a big mystery: &lt;strong&gt;what is actually happening when I “call” a smart contract?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you've ever clicked "Submit" in a Web3 app and wondered what goes on behind the scenes, this post is for you.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 TL;DR First (Then We Dive Deep)
&lt;/h3&gt;

&lt;p&gt;When you call a smart contract:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;You &lt;strong&gt;create a transaction&lt;/strong&gt; from your wallet (like MetaMask).&lt;/li&gt;
&lt;li&gt;That transaction is &lt;strong&gt;signed by you&lt;/strong&gt;, proving it’s legitimate.&lt;/li&gt;
&lt;li&gt;It gets &lt;strong&gt;sent to the blockchain network&lt;/strong&gt; (Ethereum, Polygon, etc).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nodes pick it up&lt;/strong&gt;, run the contract logic, and &lt;strong&gt;validate it&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If all goes well, it’s &lt;strong&gt;added to a block&lt;/strong&gt;, and the change becomes permanent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;But the real magic? It’s what happens &lt;em&gt;between&lt;/em&gt; those steps.&lt;/p&gt;

&lt;p&gt;Let’s walk through it with a story.&lt;/p&gt;




&lt;h3&gt;
  
  
  👩‍💻 The Story: Alice Sends a Transaction
&lt;/h3&gt;

&lt;p&gt;Say Alice wants to buy a sword in a blockchain game by calling a smart contract function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function buySword(uint swordId) public payable {
    require(msg.value &amp;gt;= swordPrice, "Not enough ETH");
    ownerOf[swordId] = msg.sender;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;She clicks “Buy” in the dApp UI. Here’s what happens:&lt;/p&gt;




&lt;h3&gt;
  
  
  🧰 Step 1: The Frontend Prepares the Payload
&lt;/h3&gt;

&lt;p&gt;The app uses &lt;strong&gt;Ethers.js&lt;/strong&gt; or &lt;strong&gt;Web3.js&lt;/strong&gt; to encode the function and arguments into something the Ethereum Virtual Machine (EVM) understands:&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="nx"&gt;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;buySword&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="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ethers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parseEther&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0.05&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This turns into a raw transaction object like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"to"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xContractAddress"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0xa9059cbb000000000000000000..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"0.05 ETH"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  🔐 Step 2: Signing the Transaction
&lt;/h3&gt;

&lt;p&gt;Before it can go anywhere, Alice’s wallet (MetaMask, WalletConnect, etc.) pops up and asks her to &lt;strong&gt;sign&lt;/strong&gt; the transaction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This doesn’t encrypt it.&lt;/li&gt;
&lt;li&gt;It simply proves: &lt;strong&gt;“Yes, I want to do this.”&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The private key never leaves her wallet, but the signature is added to the transaction.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Step 3: Broadcasting to the Network
&lt;/h3&gt;

&lt;p&gt;Once signed, the transaction is sent to the network—usually to a full node like Infura or Alchemy, or directly to an Ethereum node if you're self-hosting.&lt;/p&gt;

&lt;p&gt;This step is like saying:  &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Hey miners or validators, here’s a new transaction! Please include it in the next block!”&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  🔄 Step 4: The EVM Executes the Code
&lt;/h3&gt;

&lt;p&gt;When the transaction is picked up by a node (usually by a validator or miner), the Ethereum Virtual Machine (EVM):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Loads the smart contract's &lt;strong&gt;bytecode&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Locates the function via its &lt;strong&gt;function selector&lt;/strong&gt; (first 4 bytes of the &lt;code&gt;data&lt;/code&gt; field).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Executes the code line by line&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Updates blockchain state if successful.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If anything fails (like a failed &lt;code&gt;require&lt;/code&gt;), the whole transaction is &lt;strong&gt;reverted&lt;/strong&gt; — no changes are made.&lt;/p&gt;




&lt;h3&gt;
  
  
  ⛓️ Step 5: It’s Mined &amp;amp; Stored On-Chain
&lt;/h3&gt;

&lt;p&gt;Once the transaction passes validation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's included in the next block.&lt;/li&gt;
&lt;li&gt;That block is appended to the blockchain.&lt;/li&gt;
&lt;li&gt;The transaction becomes &lt;strong&gt;immutable history&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Anyone can verify the transaction later on block explorers like &lt;a href="https://etherscan.io" rel="noopener noreferrer"&gt;Etherscan&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧼 Behind the Scenes (Gas, Nonces, and State)
&lt;/h3&gt;

&lt;p&gt;A few more things happening under the hood:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gas&lt;/strong&gt;: The fee paid to miners/validators for computation and storage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Nonce&lt;/strong&gt;: A unique number to prevent replay attacks and ensure transaction order.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State transitions&lt;/strong&gt;: Events and changes logged to update the ledger.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Smart contracts are deterministic: if the same inputs are given, every node will compute the same result or revert.&lt;/p&gt;




&lt;h3&gt;
  
  
  🤖 Read vs Write: Calls That Don’t Cost Gas
&lt;/h3&gt;

&lt;p&gt;If Alice just wants to &lt;strong&gt;read data&lt;/strong&gt; (like checking sword ownership), no transaction is created:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sword&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;contract&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getSword&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;No gas
&lt;/li&gt;
&lt;li&gt;No miner
&lt;/li&gt;
&lt;li&gt;No blockchain write
&lt;/li&gt;
&lt;li&gt;Just a simulated EVM call against the latest state&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;These are called &lt;strong&gt;"view" functions&lt;/strong&gt; and are free.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 Summary
&lt;/h3&gt;

&lt;p&gt;When you “call” a smart contract, you're not just hitting a function. You’re:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Encoding the function and its arguments
&lt;/li&gt;
&lt;li&gt;Signing the request
&lt;/li&gt;
&lt;li&gt;Broadcasting it to the network
&lt;/li&gt;
&lt;li&gt;Letting thousands of nodes &lt;strong&gt;simulate, verify, and agree&lt;/strong&gt; on the outcome
&lt;/li&gt;
&lt;li&gt;Getting it permanently recorded on the chain&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That’s a lot of trustless magic behind one click.&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ Want to See It in Action?
&lt;/h3&gt;

&lt;p&gt;Try this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a simple contract with a public function
&lt;/li&gt;
&lt;li&gt;Deploy it to a testnet (like Sepolia)
&lt;/li&gt;
&lt;li&gt;Call it from your dApp with Ethers.js
&lt;/li&gt;
&lt;li&gt;Then watch the tx on &lt;a href="https://etherscan.io" rel="noopener noreferrer"&gt;Etherscan&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You’ll see exactly what happens, from &lt;code&gt;pending&lt;/code&gt; to &lt;code&gt;confirmed&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  💬 Over to You
&lt;/h3&gt;

&lt;p&gt;What’s the smartest (or weirdest) smart contract you’ve interacted with?&lt;br&gt;&lt;br&gt;
Ever had a tx fail mysteriously?&lt;/p&gt;

&lt;p&gt;Drop your thoughts in the comments 👇&lt;/p&gt;




&lt;h3&gt;
  
  
  👋 Let’s Connect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub:&lt;a href="https://github.com/amirofekiti/" rel="noopener noreferrer"&gt;https://github.com/amirofekiti/&lt;/a&gt;
Thanks for reading! If this helped you, consider hitting ❤️ and saving the post!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>learning</category>
      <category>blockchain</category>
    </item>
    <item>
      <title>## Blockchain Explained Like You’re 5 (With Code)</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Sat, 05 Jul 2025 02:38:45 +0000</pubDate>
      <link>https://dev.to/amirofekiti/-blockchain-explained-like-youre-5-with-code-1pg4</link>
      <guid>https://dev.to/amirofekiti/-blockchain-explained-like-youre-5-with-code-1pg4</guid>
      <description>&lt;h1&gt;
  
  
  Blockchain Explained Like You’re 5 (With Code)
&lt;/h1&gt;

&lt;p&gt;Imagine you and your friends are playing a game of marbles at recess. You all trust each other (kind of), but there's &lt;strong&gt;no teacher&lt;/strong&gt; around to keep score.&lt;/p&gt;

&lt;p&gt;So you come up with a plan:&lt;br&gt;&lt;br&gt;
Every time someone wins or loses marbles, &lt;strong&gt;you all write it down in your notebooks&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That’s the idea behind a &lt;strong&gt;blockchain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Let me explain.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧠 What Is a Blockchain (Like You’re 5)
&lt;/h2&gt;

&lt;p&gt;You and your friends:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agree on the rules&lt;/strong&gt;: If you lose, you give marbles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Write down every trade&lt;/strong&gt; in your own notebook.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep all your notebooks in sync&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If someone tries to cheat and says “I didn’t lose 3 marbles,” the others can say, “Look! It’s in &lt;em&gt;all&lt;/em&gt; our notebooks!”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That notebook?&lt;br&gt;&lt;br&gt;
That’s a &lt;strong&gt;blockchain&lt;/strong&gt; — a shared list of events that &lt;strong&gt;everyone agrees on&lt;/strong&gt; and &lt;strong&gt;no one can secretly change&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧱 What’s a Block?
&lt;/h2&gt;

&lt;p&gt;You don’t write down every marble trade immediately. Instead, every 10 trades, you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Wrap them up&lt;/li&gt;
&lt;li&gt;Add a date and summary&lt;/li&gt;
&lt;li&gt;Put it in your notebook and call it a &lt;strong&gt;block&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each block is like a chapter in your notebook, and it has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happened&lt;/li&gt;
&lt;li&gt;When it happened&lt;/li&gt;
&lt;li&gt;A fingerprint of the previous block (so no one can remove or change a chapter)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So it’s a &lt;strong&gt;chain of blocks&lt;/strong&gt;. Now we’re talking &lt;strong&gt;blockchain&lt;/strong&gt;.&lt;/p&gt;


&lt;h2&gt;
  
  
  🧪 Let's Code a Baby Blockchain (in JavaScript)
&lt;/h2&gt;

&lt;p&gt;Let’s build a tiny blockchain to understand how it works.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Block&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;previousHash&lt;/span&gt; &lt;span class="o"&gt;=&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;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;previousHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;previousHash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateHash&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;calculateHash&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;previousHash&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&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;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Blockchain&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createGenesisBlock&lt;/span&gt;&lt;span class="p"&gt;()];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;createGenesisBlock&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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Block&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="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Genesis Block&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;getLatestBlock&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="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;addBlock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newBlock&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;newBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;previousHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getLatestBlock&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;newBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;newBlock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateHash&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newBlock&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;isChainValid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;i&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="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;length&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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;previous&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chain&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;i&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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;calculateHash&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;false&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;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;previousHash&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;previous&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hash&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;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Each block is linked to the one before&lt;br&gt;&lt;br&gt;
✅ Every change makes a new hash&lt;br&gt;&lt;br&gt;
✅ Tamper-proof unless someone rewrites the whole chain (and gets everyone else to agree!)&lt;/p&gt;




&lt;h3&gt;
  
  
  🧊 But What About Crypto?
&lt;/h3&gt;

&lt;p&gt;Blockchains like &lt;strong&gt;Bitcoin&lt;/strong&gt; or &lt;strong&gt;Ethereum&lt;/strong&gt; use this structure to track:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Who sent money to whom&lt;/li&gt;
&lt;li&gt;Who owns what&lt;/li&gt;
&lt;li&gt;And make sure it’s impossible to cheat (without a lot of power and math)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of marbles, they’re trading &lt;strong&gt;coins or tokens&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  👩‍🚀 Why Should You Care?
&lt;/h3&gt;

&lt;p&gt;Because this idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Makes money programmable&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Can create &lt;strong&gt;transparent systems&lt;/strong&gt; (like for voting or public spending)&lt;/li&gt;
&lt;li&gt;Helps us build apps where &lt;strong&gt;no one can lie about the history&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And you just built one (a tiny one, but still 😄).&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 TL;DR
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;block&lt;/strong&gt; is a bundle of data + timestamp + a hash.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;blockchain&lt;/strong&gt; is a secure, connected list of those blocks.&lt;/li&gt;
&lt;li&gt;It’s like a shared notebook where everyone writes the truth—and if someone tries to lie, it breaks the chain.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  💬 Got Questions?
&lt;/h3&gt;

&lt;p&gt;Let me know in the comments!&lt;br&gt;&lt;br&gt;
Want a follow-up where we deploy this to a real blockchain? Or build a smart contract version?&lt;/p&gt;

&lt;p&gt;Hit the ❤️ if this helped you understand blockchain just a bit better.&lt;/p&gt;




&lt;h3&gt;
  
  
  👋 Let’s Connect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/amirofekiti/" rel="noopener noreferrer"&gt;https://github.com/amirofekiti/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Say hi in the comments!&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>webdev</category>
      <category>blockchain</category>
      <category>coding</category>
      <category>web3</category>
    </item>
    <item>
      <title>How I’m Building Blockchain for Public Fund Transparency</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Sat, 05 Jul 2025 02:24:53 +0000</pubDate>
      <link>https://dev.to/amirofekiti/how-im-building-blockchain-for-public-fund-transparency-3439</link>
      <guid>https://dev.to/amirofekiti/how-im-building-blockchain-for-public-fund-transparency-3439</guid>
      <description>&lt;h1&gt;
  
  
  How I’m Building Blockchain for Public Fund Transparency
&lt;/h1&gt;

&lt;p&gt;It started with frustration.&lt;/p&gt;

&lt;p&gt;I was scrolling through a government portal, trying to trace how a particular public fund was allocated, but the trail ended in vague reports and broken links. Billions were accounted for in theory, but not in practice. I thought: &lt;strong&gt;“What if there was a way to trace every single transaction, from top-level disbursement to local implementation, in a way no one could tamper with?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That’s when the idea hit me—&lt;strong&gt;why not use blockchain to build a transparent ledger for public fund management?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This post is my journey so far—technical choices, philosophical drivers, and the mistakes I’ve made (and am still making). If you care about civic tech, transparency, or blockchain for good, this one’s for you.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 The Why: Transparency Isn’t Optional—It’s Survival
&lt;/h2&gt;

&lt;p&gt;Public trust is at an all-time low in many parts of the world, and one major reason is opaque financial governance. Most citizens don’t know where their taxes go. And when they ask, they’re given PDF reports instead of raw data.&lt;/p&gt;

&lt;p&gt;Blockchain promises &lt;strong&gt;immutability&lt;/strong&gt;, &lt;strong&gt;traceability&lt;/strong&gt;, and &lt;strong&gt;public accountability&lt;/strong&gt;—values governments often claim but rarely deliver on. It’s not about cryptocurrency. It’s about &lt;em&gt;truth&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 The Stack: Building the Transparent Ledger
&lt;/h2&gt;

&lt;p&gt;Here’s what I’m currently working with:&lt;/p&gt;

&lt;h3&gt;
  
  
  🧬 Blockchain Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Choice&lt;/strong&gt;: Ethereum (using a sidechain for scalability)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Why&lt;/strong&gt;: Developer-friendly, lots of tooling, good support for smart contracts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Challenges&lt;/strong&gt;: Gas fees and complexity for non-technical users&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔐 Smart Contracts
&lt;/h3&gt;

&lt;p&gt;I’m using &lt;strong&gt;Solidity&lt;/strong&gt; to write smart contracts that handle:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fund disbursement logs&lt;/li&gt;
&lt;li&gt;Project milestones&lt;/li&gt;
&lt;li&gt;Approval workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each transaction creates a record tied to an actual budget item.&lt;/p&gt;

&lt;h3&gt;
  
  
  🌐 Frontend
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Framework&lt;/strong&gt;: React + Next.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web3 Integration&lt;/strong&gt;: Ethers.js&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Design Goals&lt;/strong&gt;:

&lt;ul&gt;
&lt;li&gt;Easy for regular users (citizens) to navigate&lt;/li&gt;
&lt;li&gt;Visual transparency: flow charts, progress bars, and audit trails&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  🗃️ Backend / Off-chain Storage
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;IPFS&lt;/strong&gt; for storing documents like contracts, invoices, and receipts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for fast querying of mirrored data (used by the frontend)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  👥 The People Problem
&lt;/h2&gt;

&lt;p&gt;The hardest part isn’t code—it’s humans.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Government stakeholders are skeptical of decentralization.&lt;/li&gt;
&lt;li&gt;NGOs are interested but lack technical staff.&lt;/li&gt;
&lt;li&gt;Citizens are curious but wary of “blockchain buzzwords.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So part of my job became &lt;strong&gt;evangelism&lt;/strong&gt;: running small workshops, creating demo walkthroughs, and building trust.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔍 Transparency in Action (Demo Use Case)
&lt;/h2&gt;

&lt;p&gt;Let’s say the Ministry of Health allocates $1M to build rural clinics. Here’s how it would work on the platform:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Smart Contract Deployed&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Ministry creates a smart contract defining the total budget, deliverables, and timeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Fund Disbursed&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Every disbursement to contractors or NGOs is logged with a transaction hash.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Milestone Verified&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Once a clinic is built, the contract triggers a milestone payment only after verifiable evidence (photos, GPS-tagged receipts) is submitted to IPFS.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Public View&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Anyone—citizens, journalists, auditors—can see the full trail from allocation to execution.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  🚧 What’s Still in Progress
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding UX&lt;/strong&gt;: Making wallet connection and blockchain concepts user-friendly
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localization&lt;/strong&gt;: Adapting for languages and regulatory contexts in multiple countries
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partnerships&lt;/strong&gt;: Collaborating with civic tech orgs for real-world pilots
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔮 The Road Ahead
&lt;/h2&gt;

&lt;p&gt;I'm under no illusion that tech alone can fix governance. But what it &lt;em&gt;can&lt;/em&gt; do is give us the tools to &lt;strong&gt;hold power accountable&lt;/strong&gt;—and to do so in a way that’s verifiable, tamper-proof, and open to all.&lt;/p&gt;

&lt;p&gt;This project is open-source, and I’m actively looking for collaborators—developers, designers, civic hackers, and policy nerds alike.&lt;/p&gt;

&lt;p&gt;If you’ve ever wanted to use your skills for public good, consider this your invitation.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Let’s Connect
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Repo: &lt;a href="https://github.com/amirofekiti" rel="noopener noreferrer"&gt;https://github.com/amirofekiti&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Twitter / X: @amirekiti &lt;/li&gt;
&lt;li&gt;Drop a comment or DM me here on Dev.to if you want to get involved!&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Building something like this isn’t easy. It’s idealistic, sometimes overwhelming, and constantly evolving. But if even one community can see exactly where their money is going—and demand better because of it—then all this is worth it.&lt;/p&gt;

&lt;p&gt;Let’s build transparency, one block at a time.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>learning</category>
      <category>web3</category>
      <category>webdev</category>
    </item>
    <item>
      <title>🌍 Help Build a Transparent Blockchain System for Public Projects | Open-Source Collaboration</title>
      <dc:creator>Amir of Ekiti</dc:creator>
      <pubDate>Wed, 28 May 2025 20:21:21 +0000</pubDate>
      <link>https://dev.to/amirofekiti/help-build-a-transparent-blockchain-system-for-public-projects-open-source-collaboration-1kmg</link>
      <guid>https://dev.to/amirofekiti/help-build-a-transparent-blockchain-system-for-public-projects-open-source-collaboration-1kmg</guid>
      <description>&lt;p&gt;🛠️ &lt;strong&gt;Project:&lt;/strong&gt; &lt;a href="https://github.com/amirofekiti/NDDC-Blockchain-Prototype" rel="noopener noreferrer"&gt;NDDC Blockchain Prototype&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hey devs! 👋&lt;/p&gt;

&lt;p&gt;We're building a decentralized web application (DApp) to bring &lt;strong&gt;transparency&lt;/strong&gt; and &lt;strong&gt;accountability&lt;/strong&gt; to public fund management using Ethereum smart contracts. This project simulates a blockchain-powered platform for the &lt;em&gt;Niger Delta Development Commission (NDDC)&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  💡 Why This Matters
&lt;/h3&gt;

&lt;p&gt;Public institutions in developing regions often suffer from inefficiency and corruption. Our solution uses &lt;strong&gt;blockchain&lt;/strong&gt; to automate fund disbursements, ensure transparency, and build trust among stakeholders.&lt;/p&gt;




&lt;h3&gt;
  
  
  🚀 Project Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;💰 ETH fund deposit &amp;amp; admin disbursement via MetaMask&lt;/li&gt;
&lt;li&gt;🔐 Smart contract deployed on Sepolia Testnet&lt;/li&gt;
&lt;li&gt;🌐 Real-time frontend interaction with Web3.js&lt;/li&gt;
&lt;li&gt;🔎 Transaction history viewable and verifiable on-chain&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live Demo:&lt;/strong&gt; &lt;a href="https://nddc-blockchain-prototype.vercel.app" rel="noopener noreferrer"&gt;nddc-blockchain-prototype.vercel.app&lt;/a&gt;&lt;br&gt;&lt;br&gt;
📄 &lt;strong&gt;Smart Contract Code:&lt;/strong&gt; &lt;code&gt;contracts/ProjectFunding.sol&lt;/code&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠 Tech Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Solidity&lt;/strong&gt; (smart contract logic)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardhat&lt;/strong&gt; (development &amp;amp; testing)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ethereum Sepolia&lt;/strong&gt; (testnet deployment)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript + Web3.js&lt;/strong&gt; (frontend)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MetaMask&lt;/strong&gt; (wallet integration)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vercel&lt;/strong&gt; (deployment)&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  🤝 How to Contribute
&lt;/h3&gt;

&lt;p&gt;We’re looking for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Solidity/Hardhat devs&lt;/li&gt;
&lt;li&gt;Web3 frontend engineers&lt;/li&gt;
&lt;li&gt;UI/UX designers&lt;/li&gt;
&lt;li&gt;Feature brainstormers (e.g., audit trails, role-based access, notifications)&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;💻 &lt;a href="https://github.com/amirofekiti/NDDC-Blockchain-Prototype" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;To contribute:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Fork &amp;amp; clone the repo&lt;/li&gt;
&lt;li&gt;Create a feature branch&lt;/li&gt;
&lt;li&gt;Submit a PR with clear documentation&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;Let’s work together to build a tool that public institutions can actually use. All contributions—big or small—are welcome! 💬 Comment below or connect on GitHub.&lt;/p&gt;

</description>
      <category>ethereum</category>
      <category>blockchain</category>
      <category>opensource</category>
      <category>hardhat</category>
    </item>
  </channel>
</rss>
