<?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: ORJI CECILIA O.</title>
    <description>The latest articles on DEV Community by ORJI CECILIA O. (@vivcis).</description>
    <link>https://dev.to/vivcis</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%2F437714%2F68bd8ba6-cf0b-424d-b474-c60f0878c5b8.jpeg</url>
      <title>DEV Community: ORJI CECILIA O.</title>
      <link>https://dev.to/vivcis</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vivcis"/>
    <language>en</language>
    <item>
      <title>React Hooks Explained: A Beginner's Guide</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Fri, 07 Mar 2025 16:36:39 +0000</pubDate>
      <link>https://dev.to/vivcis/understanding-react-hooks-5b53</link>
      <guid>https://dev.to/vivcis/understanding-react-hooks-5b53</guid>
      <description>&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Hook?
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
Hooks were added to React in version 16.8. They allow function components to access state and other React features. Hooks allows us to "hook" into React features such as state and lifecycle methods.&lt;/p&gt;

&lt;p&gt;In summary, Hooks are special functions that let function components use features that were only available in class components before React 16.8. Simply put, they let function components "do more" without needing a class.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For example:&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;import React, { useState } from 'react';

const Counter = () =&amp;gt; {
  //useState hook to manage count state
  const [count, setCount] = useState(0);  

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Count: {count}&amp;lt;/p&amp;gt;
      &amp;lt;button onClick={() =&amp;gt; setCount(count + 1)}&amp;gt;Increase&amp;lt;/button&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

export default Counter;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;useState(0) creates a state variable count starting at 0.&lt;/li&gt;
&lt;li&gt;setCount(count + 1) updates the count when the button is clicked.&lt;/li&gt;
&lt;li&gt;Every time the button is clicked, React re-renders the component 
with the new count.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a simple example of how hooks let function components manage state without needing a class component.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hook Rules&lt;/strong&gt;&lt;br&gt;
There are 3 rules for hooks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Hooks can only be called inside React function components.&lt;/li&gt;
&lt;li&gt;Hooks can only be called at the top level of a component.&lt;/li&gt;
&lt;li&gt;Hooks cannot be conditional&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's go into the different react hooks;&lt;/p&gt;
&lt;h2&gt;
  
  
  useState
&lt;/h2&gt;

&lt;p&gt;The React useState Hook allows us to track state in a function component. state generally refers to data or properties that need to be tracked in an application. Just like in the example above, A simple counter that remembers the number when you click a button.&lt;/p&gt;
&lt;h2&gt;
  
  
  useEffect
&lt;/h2&gt;

&lt;p&gt;This runs code when something changes. Think of it as a way to run code when your component loads or updates.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Fetching data from an API when the page loads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useEffect } from 'react';

const FetchData = () =&amp;gt; {
  const [data, setData] = useState([]);

  useEffect(() =&amp;gt; {
    fetch('https://jsonplaceholder.typicode.com/posts')
      .then((res) =&amp;gt; res.json())
      .then((data) =&amp;gt; setData(data));
  }, []); //runs only once when the component loads

  return &amp;lt;p&amp;gt;Data Loaded: {data.length} items&amp;lt;/p&amp;gt;;
};

export default FetchData;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;useEffect(() =&amp;gt; {...}, []) runs once when the component loads.&lt;/li&gt;
&lt;li&gt;It fetches data and stores it in state using setData(data).&lt;/li&gt;
&lt;li&gt;Without useEffect, this code would run every time the component 
updates, causing an infinite loop!&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  useContext
&lt;/h2&gt;

&lt;p&gt;This is used to avoid passing props manually. This is a way to share data across components without passing props down manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Managing a theme (dark/light mode) globally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { createContext, useContext } from 'react';

//create a Context for the theme
const ThemeContext = createContext('light');

const ThemedComponent = () =&amp;gt; {

   //access the theme value
  const theme = useContext(ThemeContext);
  return &amp;lt;p&amp;gt;Current theme: {theme}&amp;lt;/p&amp;gt;;
};

const App = () =&amp;gt; (
  &amp;lt;ThemeContext.Provider value="dark"&amp;gt;
    &amp;lt;ThemedComponent /&amp;gt;
  &amp;lt;/ThemeContext.Provider&amp;gt;
);

export default App;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;createContext('light') creates a global state (default theme is 
"light").&lt;/li&gt;
&lt;li&gt;useContext(ThemeContext) allows any component to access the theme 
without prop drilling.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  useRef
&lt;/h2&gt;

&lt;p&gt;This keeps a value without re-rendering. Think of it as a way to store a value that React won’t forget but won’t trigger re-renders.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Automatically focus on an input field when the page loads.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useRef, useEffect } from 'react';

const FocusInput = () =&amp;gt; {
  const inputRef = useRef(null);

  useEffect(() =&amp;gt; {

    //focuses on the input when the page loads
    inputRef.current.focus(); 
  }, []);

  return &amp;lt;input ref={inputRef} type="text" placeholder="Type here..." /&amp;gt;;
};

export default FocusInput;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;useRef(null) creates a reference to an input field.&lt;/li&gt;
&lt;li&gt;inputRef.current.focus() makes the input auto-focus when the page 
loads.&lt;/li&gt;
&lt;li&gt;Unlike useState, useRef does not trigger a re-render when updated&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  useMemo
&lt;/h2&gt;

&lt;p&gt;This is used to improve performance.&lt;br&gt;
Think of it as a way to "&lt;strong&gt;remember&lt;/strong&gt;" a value so React doesn’t calculate it every time.&lt;br&gt;
&lt;strong&gt;Example:&lt;/strong&gt; Squaring a number without unnecessary recalculations.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useMemo } from 'react';

const ExpensiveCalculation = ({ number }) =&amp;gt; {
  const squared = useMemo(() =&amp;gt; {
    console.log('Calculating square...');
    return number * number;
  }, [number]);

  return &amp;lt;p&amp;gt;Squared: {squared}&amp;lt;/p&amp;gt;;
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;useMemo(() =&amp;gt; number * number, [number]) remembers the calculation 
and only updates if number changes.&lt;/li&gt;
&lt;li&gt;Without useMemo, React would re-calculate the square every render, 
which is inefficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  useCallback
&lt;/h2&gt;

&lt;p&gt;This prevents unnecessary re-creation of functions. It is used to prevent functions from being recreated when not needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Preventing unnecessary re-renders in child components.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import React, { useState, useCallback } from 'react';

const Button = ({ handleClick }) =&amp;gt; {
  console.log('Button re-rendered');
  return &amp;lt;button onClick={handleClick}&amp;gt;Click me&amp;lt;/button&amp;gt;;
};

const Parent = () =&amp;gt; {
  const [count, setCount] = useState(0);

  const memoizedHandleClick = useCallback(() =&amp;gt; {
    setCount((prev) =&amp;gt; prev + 1);
  }, []);

  return (
    &amp;lt;div&amp;gt;
      &amp;lt;p&amp;gt;Count: {count}&amp;lt;/p&amp;gt;
      &amp;lt;Button handleClick={memoizedHandleClick} /&amp;gt;
    &amp;lt;/div&amp;gt;
  );
};

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;useCallback(() =&amp;gt; {...}, []) stores the function so it doesn’t 
change unless dependencies change.&lt;/li&gt;
&lt;li&gt;Without useCallback, the button would re-render unnecessarily on 
every parent re-render&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;React also supports &lt;strong&gt;custom hooks&lt;/strong&gt; which are reusable logic inside hooks. Instead of copying logic between components, you can create a custom hook and reuse it. They are commonly used for fetching data, managing authentication, or handling forms.&lt;/p&gt;

&lt;p&gt;React Hooks make function components more powerful by letting us manage state, side effects, and performance optimizations without needing class components.&lt;/p&gt;

&lt;p&gt;If you’re just starting, focus on &lt;strong&gt;useState&lt;/strong&gt; for state management, &lt;strong&gt;useEffect&lt;/strong&gt; for side effects like API calls, and &lt;strong&gt;useContext&lt;/strong&gt; for sharing global data. As you grow, explore hooks like useRef, useMemo, and useReducer for better performance and complex logic.&lt;/p&gt;

&lt;p&gt;Mastering hooks will help you write cleaner, more efficient React apps—so keep practicing and building!&lt;/p&gt;

</description>
      <category>react</category>
      <category>programming</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building Fully On-Chain NFTs with Solidity: A Step-by-Step Guide</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Thu, 27 Feb 2025 04:06:07 +0000</pubDate>
      <link>https://dev.to/vivcis/onchain-nft-with-solidity-158i</link>
      <guid>https://dev.to/vivcis/onchain-nft-with-solidity-158i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
In the world of NFTs, most digital assets rely on off-chain storage solutions like IPFS or centralized servers for storing metadata and images. But what if you could store everything directly on the blockchain—including the NFT artwork?&lt;/p&gt;

&lt;p&gt;In this article, we’ll walk through the creation of an on-chain NFT using Solidity. This NFT contract generates SVG images dynamically, encodes them in Base64, and serves them directly from the smart contract—ensuring permanence and full decentralization.&lt;/p&gt;

&lt;p&gt;By the end, you'll understand how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generate on-chain SVG images for NFTs&lt;/li&gt;
&lt;li&gt;Use Base64 encoding to store images within smart contracts&lt;/li&gt;
&lt;li&gt;Implement a fully decentralized ERC-721 contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's get into it!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Understanding On-Chain NFTs&lt;/strong&gt;&lt;br&gt;
Traditional NFTs store images and metadata off-chain, meaning if a hosting service goes down, the NFT might lose its artwork. On-chain NFTs, on the other hand, embed all data within the blockchain, ensuring that they remain accessible as long as Ethereum exists.&lt;/p&gt;

&lt;p&gt;In this tutorial, we’ll create a fully on-chain NFT that:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses Solidity to generate an SVG image&lt;/li&gt;
&lt;li&gt;Stores both the image and metadata directly on the blockchain&lt;/li&gt;
&lt;li&gt;Mints NFTs dynamically without relying on external storage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This means that every NFT image is programmatically generated and stored directly inside the smart contract.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Smart Contract&lt;/strong&gt;&lt;br&gt;
Here’s the full Solidity code for our on-chain NFT contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.28;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

contract OnChainNFT is ERC721 {
    using Strings for uint;
    uint256 public tokenId;

    constructor() ERC721 ("ceceNFT", "cece") {
        tokenId = 1;
    }

    event NFTMinted(address indexed owner, uint256 tokenId);

    function generateSVG() internal pure returns (string memory) {
        string memory svg = string(
            abi.encodePacked(
            '&amp;lt;svg xmlns="http://www.w3.org/2000/svg" width="500" height="500"&amp;gt;',
            '&amp;lt;rect width="100%" height="100%" fill="black" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="210" fill="orange" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="190" fill="white" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="170" fill="red" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="150" fill="yellow" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="130" fill="green" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="110" fill="blue" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="90" fill="purple" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="70" fill="pink" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="50" fill="brown" /&amp;gt;',
            '&amp;lt;circle cx="250" cy="250" r="30" fill="black" /&amp;gt;',
            '&amp;lt;/svg&amp;gt;'
        ));
        return string(abi.encodePacked("data:image/svg+xml;base64,", Base64.encode(bytes(svg))));
    }

    function mintNFT() public {
        tokenId++;
        _safeMint(msg.sender, tokenId);
        emit NFTMinted(msg.sender, tokenId);
    }

    function tokenURI(uint256 tokenTxId) public view override returns (string memory) {
        ownerOf(tokenTxId);

        string memory name = string(abi.encodePacked("cece ", Strings.toString(tokenTxId)));
        string memory description = "My NFT";
        string memory image = generateSVG();

        string memory json = string(
            abi.encodePacked(
                '{"name": "', name, '", ',
                '"description": "', description, '", ',
                '"image": "', image, '"}'
            )
        );
        return string(abi.encodePacked("data:application/json;base64,", Base64.encode(bytes(json))));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let’s break this contract down step by step.&lt;br&gt;
&lt;strong&gt;1. Contract Setup&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;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Base64.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;ERC721.sol → Standard implementation for NFTs.&lt;/li&gt;
&lt;li&gt;Base64.sol → Used to encode images &amp;amp; metadata in Base64 format.&lt;/li&gt;
&lt;li&gt;Strings.sol → Helps convert numbers to string format.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you haven't installed OpenZeppelin yet, run in your terminal&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @openzeppelin/contracts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Generating the SVG Image&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function generateSVG() internal pure returns (string memory) {&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This function creates the SVG artwork for the NFT.&lt;/li&gt;
&lt;li&gt;Each circle inside the SVG creates a layered bullseye effect.&lt;/li&gt;
&lt;li&gt;The final SVG is Base64 encoded so it can be stored directly in the 
smart contract.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example Output of generateSVG()&lt;br&gt;
&lt;code&gt;data:image/svg+xml;base64,PHN2ZyB...&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This can be directly displayed in browsers or NFT marketplaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Minting the NFT&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function mintNFT() public {&lt;br&gt;
    tokenId++;&lt;br&gt;
    _safeMint(msg.sender, tokenId);&lt;br&gt;
    emit NFTMinted(msg.sender, tokenId);&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Calls _safeMint() to safely assign a new NFT to msg.sender.&lt;/li&gt;
&lt;li&gt;Uses an incrementing tokenId to ensure each NFT has a unique identifier.&lt;/li&gt;
&lt;li&gt;Emits an event to log the minting.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Generating Metadata for Marketplaces&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;function tokenURI(uint256 tokenTxId) public view override returns (string memory) {&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generates the NFT metadata in JSON format.&lt;/li&gt;
&lt;li&gt;Encodes everything in Base64 to be fully on-chain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example Output (for tokenTxId = 1)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{&lt;br&gt;
    "name": "cece 1",&lt;br&gt;
    "description": "My NFT",&lt;br&gt;
    "image": "data:image/svg+xml;base64,PHN2ZyB..."&lt;br&gt;
}&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
NB - This metadata is formatted to match OpenSea &amp;amp; other marketplaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why On-Chain NFTs Are Revolutionary&lt;/strong&gt;&lt;br&gt;
Unlike traditional NFTs that rely on external servers or IPFS, on-chain NFTs ensure: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Permanence → Your NFT never disappears (even if IPFS goes offline).&lt;/li&gt;
&lt;li&gt;Decentralization → No third-party hosting needed.&lt;/li&gt;
&lt;li&gt;Immutability → The image &amp;amp; metadata live forever on the blockchain.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Deploying Your On-Chain NFT to Base Sepolia&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that we've built our fully on-chain NFT contract, let's deploy it to Base Sepolia, a testnet optimized for Ethereum L2 solutions. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setting Up Your Deployment Script (deploy.ts)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a new file inside the scripts/ folder:&lt;br&gt;
scripts/deploy.ts&lt;/p&gt;

&lt;p&gt;`import { ethers } from "hardhat";&lt;/p&gt;

&lt;p&gt;async function main() {&lt;br&gt;
    console.log("Deploying NFT contract...");&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const NFT = await ethers.getContractFactory("OnChainNFT");
const nft = await NFT.deploy();

await nft.waitForDeployment();

const contractAddress =  await nft.getAddress();

console.log("Minting first NFT...");

const tx = await nft.mintNFT();
await tx.wait();

console.log("NFT minted at address:", contractAddress);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;main().catch((error) =&amp;gt; {&lt;br&gt;
    console.error("deployment failed:",error);&lt;br&gt;
    process.exitCode = 1;&lt;br&gt;
});&lt;br&gt;
`&lt;br&gt;
This script does the following: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Compiles the NFT contract&lt;/li&gt;
&lt;li&gt;Deploys it to the Base Sepolia network&lt;/li&gt;
&lt;li&gt;Mints the first NFT automatically after deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Configuring Hardhat for Base Sepolia&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, update your Hardhat configuration to support Base Sepolia.&lt;br&gt;
hardhat.config.ts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { HardhatUserConfig } from "hardhat/config";
import "@nomicfoundation/hardhat-toolbox";
import "@nomicfoundation/hardhat-verify";
import "dotenv/config"; // Use dotenv for environment variables

const { 
  ALCHEMY_BASE_SEPOLIA_API_KEY_URL,
  ACCOUNT_PRIVATE_KEY, 
  ETHERSCAN_API_KEY 
} = process.env;

const config: HardhatUserConfig = {
  solidity: "0.8.28",

  networks: {
    base_sepolia: {
      url: ALCHEMY_BASE_SEPOLIA_API_KEY_URL,
      accounts: ACCOUNT_PRIVATE_KEY ? [`0x${ACCOUNT_PRIVATE_KEY}`] : [],
      timeout: 120000, 
    },
  },

  etherscan: {
    apiKey: ETHERSCAN_API_KEY,
  },
};

export default config;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What This Does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configures Base Sepolia testnet using Alchemy&lt;/li&gt;
&lt;li&gt;Loads private keys securely from .env&lt;/li&gt;
&lt;li&gt;Enables contract verification on Etherscan&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Setting Up Environment Variables (.env File)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a .env file in the root of your Hardhat project and add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ALCHEMY_BASE_SEPOLIA_API_KEY_URL="https://basesepolia.alchemyapi.io/v2/YOUR_ALCHEMY_KEY"
ACCOUNT_PRIVATE_KEY="YOUR_WALLET_PRIVATE_KEY"
ETHERSCAN_API_KEY="YOUR_ETHERSCAN_API_KEY"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;NB - Never hardcode private keys in your code. Always use environment variables.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying the NFT to Base Sepolia&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A - Install Dependencies&lt;br&gt;
If you haven’t already installed Hardhat and the required plugins:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @nomicfoundation/hardhat-toolbox @nomicfoundation/hardhat-verify dotenv ethers hardhat&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
B - Compile the Contract&lt;br&gt;
Run:&lt;br&gt;
&lt;code&gt;npx hardhat compile&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
C - Deploy the Contract&lt;br&gt;
Run:&lt;br&gt;
&lt;code&gt;npx hardhat run scripts/deploy.ts --network base_sepolia&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
 Deploys the OnChainNFT contract to Base Sepolia&lt;br&gt;
 Automatically mints the first NFT after deployment&lt;/p&gt;

&lt;p&gt;D - Expected output after deployment&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx hardhat run scripts/deploy.ts --network base_sepolia&lt;br&gt;
Compiled 1 Solidity file successfully (evm target: paris).&lt;br&gt;
Deploying NFT contract...&lt;br&gt;
Minting first NFT...&lt;br&gt;
NFT minted at address: 0x81783AC13C6Bdf030d8De279a13b63E4406287Da&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verifying the Contract on Etherscan&lt;/strong&gt;&lt;br&gt;
This is optional and it is to make your contract publicly viewable, verify it on Base Sepolia Etherscan:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx hardhat verify --network base_sepolia 0xYourDeployedContractAddress&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
This allows anyone to interact with your NFT contract directly from Etherscan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Viewing Your On-Chain NFT on OpenSea&lt;/strong&gt;&lt;br&gt;
To view on opensea, go to &lt;a href="https://testnets.opensea.io/" rel="noopener noreferrer"&gt;url&lt;/a&gt;, signup and connect your wallet if you are not signed up. Go to your account or profile and you can view your nft. Here is our minted &lt;a href="https://testnets.opensea.io/assets/base_sepolia/0x81783ac13c6bdf030d8de279a13b63e4406287da/2" rel="noopener noreferrer"&gt;nft&lt;/a&gt;&lt;/p&gt;

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

</description>
      <category>blockchain</category>
      <category>nft</category>
      <category>solidity</category>
      <category>ethereum</category>
    </item>
    <item>
      <title>MY ERC20 WALKTHROUGH</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Wed, 26 Feb 2025 15:23:04 +0000</pubDate>
      <link>https://dev.to/vivcis/my-erc20-walkthrough-33ab</link>
      <guid>https://dev.to/vivcis/my-erc20-walkthrough-33ab</guid>
      <description>&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  What is an ERC20?
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
Ethereum Request for Comment 20 (ERC20) is a standard for the Ethereum blockchain that defines a set of required functions and events for creating fungible tokens within a smart contract. ERC20 can be thought of as a set of predefined function signatures that any token contract must implement to be compatible with Ethereum's ecosystem.&lt;/p&gt;

&lt;p&gt;By the end of this article, you will gain a clear understanding of function signatures, particularly those found in ERC20, and how to create custom functions using established patterns. We will also explore events, their practical applications, and examine real-world use cases of ERC20, along with examples of decentralized applications (dApps) that utilize ERC20.&lt;br&gt;
**&lt;br&gt;
Use Cases of ERC20**&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Decentralized Finance (DeFi)
ERC-20 tokens play a critical role in decentralized finance (DeFi) by enabling various financial applications:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stablecoins: ERC-20 tokens represent fiat-pegged digital assets to provide stability for users.&lt;br&gt;
Lending and Borrowing: Users can earn interest on ERC-20 assets or use them as collateral to access liquidity.&lt;br&gt;
Decentralized Exchanges (DEXs): ERC-20 tokens allow peer-to-peer trading without intermediaries.&lt;br&gt;
Yield Farming: Users earn rewards by providing liquidity to DeFi protocols.&lt;br&gt;
ERC-20 tokens have transformed traditional finance by providing decentralized alternatives to banking, lending, and trading.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Non-Fungible Tokens (NFTs)&lt;/strong&gt;&lt;br&gt;
Although NFTs are primarily based on ERC-721 and ERC-1155, ERC-20 tokens still play a key role in the NFT ecosystem:&lt;/p&gt;

&lt;p&gt;Wrapped NFTs: ERC-20 tokens can represent ownership of NFTs, allowing them to be traded on decentralized exchanges.&lt;br&gt;
NFT Marketplaces: ERC-20 tokens act as the primary currency for buying and selling NFTs.&lt;br&gt;
Platform Governance: Some NFT projects use ERC-20 tokens for voting and decision-making within their ecosystems.&lt;br&gt;
By integrating ERC-20 tokens, the NFT market has expanded its liquidity, accessibility, and interoperability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Gaming&lt;/strong&gt;&lt;br&gt;
The gaming industry is leveraging ERC-20 tokens in multiple ways:&lt;/p&gt;

&lt;p&gt;In-Game Currency: Players use ERC-20 tokens to purchase virtual assets and access premium content.&lt;br&gt;
Asset Ownership: Blockchain gaming platforms use ERC-20 tokens to allow true ownership of digital assets.&lt;br&gt;
Decentralized Economies: Play-to-earn games use ERC-20 tokens as rewards for gameplay achievements.&lt;br&gt;
Community Governance: Some gaming platforms let players vote on game updates using ERC-20 tokens.&lt;br&gt;
ERC-20 tokens have revolutionized gaming by creating decentralized economies where players have true ownership and financial incentives.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Supply Chain Management&lt;/strong&gt;&lt;br&gt;
ERC-20 tokens are increasingly integrated into supply chain management to improve transparency and efficiency:&lt;/p&gt;

&lt;p&gt;Product Tracking: Companies tokenize physical goods with ERC-20 tokens for real-time tracking on the blockchain.&lt;br&gt;
Inventory Management: Automated token-based inventory systems reduce errors and fraud.&lt;br&gt;
Supply Chain Financing: Companies tokenize invoices and purchase orders for faster payments and financing.&lt;br&gt;
Sustainability Tracking: Consumers can verify the environmental and ethical impact of a product.&lt;br&gt;
By leveraging ERC-20 tokens, supply chain networks become more secure, transparent, and efficient.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Tokenized Assets&lt;/strong&gt;&lt;br&gt;
ERC-20 tokens facilitate fractional ownership of assets, making high-value investments more accessible:&lt;/p&gt;

&lt;p&gt;Real Estate: Investors can own fractions of real estate through ERC-20 tokens.&lt;br&gt;
Stocks &amp;amp; Bonds: Traditional securities can be tokenized, allowing global, 24/7 trading.&lt;br&gt;
Intellectual Property: Artists and creators can sell tokenized shares of their work.&lt;br&gt;
Art &amp;amp; Collectibles: Rare assets can be fractionalized and traded on digital marketplaces.&lt;br&gt;
Tokenization using ERC-20 removes barriers to investment and increases asset liquidity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Stablecoins&lt;/strong&gt;&lt;br&gt;
ERC-20 tokens are at the core of stablecoin development, enabling price-stable cryptocurrencies:&lt;/p&gt;

&lt;p&gt;Fiat-Pegged Stablecoins: Tokens like USDT, USDC, and DAI are backed by real-world assets.&lt;br&gt;
Algorithmic Stablecoins: Some ERC-20 stablecoins maintain stability without collateral by using smart&lt;/p&gt;

&lt;h2&gt;
  
  
  EXAMPLE OF DECENTRALIZED APPLICATIONS THAT USES ERC20
&lt;/h2&gt;

&lt;p&gt;Some prominent examples of decentralized applications (dApps) that utilize ERC-20 tokens include Uniswap (a decentralized exchange for trading ERC-20 tokens), Aave (a DeFi platform for lending and borrowing crypto assets), and Compound (another DeFi platform for lending and borrowing), all of which operate on the Ethereum blockchain and rely on the ERC-20 standard for token functionality.&lt;/p&gt;

&lt;p&gt;In order to Properly understand what the function in ERC20, here are some basics you should take note of:&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;What is a function signature?&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
A function Signature is a unique identifier for a function in a program. It is the hash of a function’s component which are: &lt;/p&gt;

&lt;p&gt;Function name: The function name is the name given to the function as a unique entity&lt;/p&gt;

&lt;p&gt;Function parameters: These are the inputs that a function receives. They can be one or many. They can vary in number and type.&lt;/p&gt;

&lt;p&gt;Function visibility: This refers to where can a function be visible from(i.e within or from outside your code) when a user wants to interact with it . Its visibility can include public, internal, external and private.&lt;/p&gt;

&lt;p&gt;Function return types: This refers to the kind of value that the function returns. It could be a single value, an array of values, an object or any data type.&lt;/p&gt;

&lt;p&gt;Function modifiers: Modifiers are keywords that are added to the definitions of functions to alert the functionality of a function. They can be used to control access to the function, to modify the return type of the function, or to impose other restrictions or allowances on the function.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT ARE EVENTS IN SOLIDITY?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In Solidity, events are a way to log and notify external entities (such as user interfaces or other smart contracts) about specific occurrences within a smart contract. They serve as a mechanism for emitting and recording data onto the blockchain, making it transparent and easily accessible. Emits, on the other hand, are used to trigger or emit events within the smart contract code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Defining and Emitting Events:
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;a. Event Declaration:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To define an event, you need to declare it within the contract. An event declaration consists of the event’s name, a list of parameters (if any), and their data types. Here’s an example:&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%2F3lqg7p72dvtrwv2dirk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3lqg7p72dvtrwv2dirk0.png" alt="Image description" width="800" height="216"&gt;&lt;/a&gt;&lt;br&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%2F38cjd4dozxwps9dxn4x6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F38cjd4dozxwps9dxn4x6.png" alt="Image description" width="800" height="287"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this example, we define an event named “NewTransaction” that takes three parameters: transactionId (an unsigned integer), sender (an Ethereum address), and amount (an unsigned integer).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;b. Emitting Events:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;To emit an event within the contract, you use the “emit“ keyword followed by the event name and any necessary parameters. Here's an example of emitting the Successfultxn event:In this example, we define an event named “Successfultxn” that takes three parameters: transactionId (an unsigned integer), sender (an Ethereum address), and amount (an unsigned integer).&lt;/p&gt;

&lt;p&gt;b. Emitting Events:&lt;/p&gt;

&lt;p&gt;To emit an event within the contract, you use the “emit“ keyword followed by the event name and any necessary parameters. Here's an example of emitting the succussfultxn event:&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%2Fhbuz6ojkbn550yo6mtn0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhbuz6ojkbn550yo6mtn0.png" alt="Image description" width="800" height="97"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So lets get into the code&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%2Fd8mbe15rzjo44jgpff06.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd8mbe15rzjo44jgpff06.png" alt="Image description" width="800" height="650"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here the code started with me declaring the license Identifier as unlicensed meaning that the code base is not under any open source license and does not grant permission for others to use, modify or distribute. &lt;/p&gt;

&lt;p&gt;Followed immediately is version of solidity compiler that solidity uses (0.8.28). Then the name of the contract was named as “erc20”. &lt;/p&gt;

&lt;p&gt;State variables named name, symbol, _decimals and total supply was declared with the data type string, string, uint8 and uint256 respectively. &lt;/p&gt;

&lt;p&gt;Also an address data type name owner was declared. Then both a mapping and a 2D mapping data type was declared name balances and allowances where both were given the visibility as public meaning, that under the hood, a getter function has also been declared to us. &lt;/p&gt;

&lt;p&gt;Custom errors was also written that would be used in the contract. These custom errors are name InvalidAddress, InsufficientFunds, InsufficientAllowance, OnlyOwnerAllowed and InvalidAmount.&lt;/p&gt;

&lt;p&gt;Then comes the 2 events need when interacting with an ERC20 standard. The Transfer and the Approval. The minted event was added by me. The Transfer event carries three parameters, the from with an address data type, to also with an address data type and value with a unsigned Integer data type. As for Approval, its parameters includes owner with address data type, spender also with an address data type and an unsigned Integer named value.&lt;/p&gt;

&lt;p&gt;Then a modifier is defined. Remember one of the details that can be found in a function signature is a function modifier and this function modifier was written like how the modifier called onlyOwner is written. It carries a condition that if msg.sender(a users interacting with a particular function in our contract) isnt equals to the owner that was declared earlier the, code should be reverted with OnlyOwnerAllowed custom error that was defined above.&lt;/p&gt;

&lt;p&gt;Now lets go to our functions declarations.&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%2Fv3jp6a0k2dba0agrirhj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv3jp6a0k2dba0agrirhj.png" alt="Image description" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The first function declared in the contract is name(). It has public visibility, a view function modifier, and returns a string stored in memory. This function serves as a getter function, retrieving the value of the _name state variable declared earlier in the contract.&lt;/p&gt;

&lt;p&gt;Since Ethereum operates as a state machine, this function simply reads the value stored in the _name variable. The public visibility means the function can be called both internally (within the contract) and externally (by other contracts or users). The view modifier ensures that the function does not modify the blockchain state but only retrieves data. The returns keyword specifies the expected return data type, which in this case is a string—matching the _name state variable.&lt;/p&gt;

&lt;p&gt;This same principle applies to other getter functions like symbol(), decimals(), and totalSupply(), each of which retrieves the corresponding state variable value without modifying the blockchain state.&lt;/p&gt;

&lt;p&gt;The balanceOf function is responsible for retrieving the token balance of a specific address. It takes an address parameter (owner) and has a function visibility of public with a view modifier. This means it does not alter blockchain data but only reads and returns an unsigned integer (uint256) representing the balance.&lt;/p&gt;

&lt;p&gt;Before returning the balance, the function first performs a sanity check to ensure the provided address is not the zero address (0x0). If the check fails, it triggers a custom error InvalidAddress, preventing invalid balance lookups.&lt;/p&gt;

&lt;p&gt;In Solidity, mappings are used to store key-value pairs. The balanceOf function retrieves a balance using the balances mapping, where the key is an address, and the value is the associated token balance. This mapping ensures efficient storage and retrieval of token balances without the need for looping through data.&lt;/p&gt;

&lt;p&gt;By following this structure, balanceOf efficiently tracks token ownership, ensuring security and accuracy in ERC20 token implementations.&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%2Ffdp8b16fm1b85t7bsicx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffdp8b16fm1b85t7bsicx.png" alt="Image description" width="800" height="41"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The balances mapping is publicly accessible and is used to store the token balance of each address. It is defined with the address data type as the key and uint256 as the value. This means that each Ethereum address is associated with a specific numeric balance representing the amount of tokens it holds.&lt;/p&gt;

&lt;p&gt;To retrieve the balance of a particular address using this mapping, the key (the address) is passed in as follows:&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%2Fighyl09c9dp1uhze7gxb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fighyl09c9dp1uhze7gxb.png" alt="Image description" width="294" height="46"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The _owner inside the square bracket act as the key pointing to a value with the data type uint256 and this uint256 is what is been returned from the function.&lt;/p&gt;

&lt;p&gt;It is worthy to recognize that the function balanceOf returns a uint256 with an implicit return name balance. So the balance which has a data type of uint256 is set to the balances mapping .&lt;/p&gt;

&lt;p&gt;The transfer function takes two arguments, the address data type named to and a uint256 named value, and returns a boolean implicitly name success. The function checks if address argument to is an address zero and if true return the InvalidAddress custom error. Also the function check if argument value is greater than the balance of the msg.sender(a user interacting with the function), if true return InsufficientFunds custom error. Then the balances mapping of the msg.sender is decremented by the value passed as an argument, while the balances mapping of the to address passed in the argument is incremented with the value passed into the argument since we are trying to transfer from the caller of the function to the receiver , in this case the to address. Also remember that an event was set earlier in our contract called Transfer. That event is emitted whenever this function is called. Recall that the event received three parameters and because of this the emit also would have to hold three parameter relative to the parameter in the event. The parameters to be emit are the address of the msg.sender, the address of the to and the value. Since the function returns a boolean implicitly named success, success is set to true.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Bitcoin Mining and the 51% Attack</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Sat, 24 Feb 2024 02:32:20 +0000</pubDate>
      <link>https://dev.to/vivcis/bitcoin-mining-and-the-51-attack-4a8m</link>
      <guid>https://dev.to/vivcis/bitcoin-mining-and-the-51-attack-4a8m</guid>
      <description>&lt;p&gt;**&lt;/p&gt;

&lt;h2&gt;
  
  
  WHY DOES MINING EXIST?
&lt;/h2&gt;

&lt;p&gt;**&lt;br&gt;
To start at the beginning, let's look at why mining exists in the first place. The whole premise of Bitcoin is &lt;code&gt;decentralization&lt;/code&gt;. So whose responsibility is it to provide security to the users of the network? When you use Visa or PayPal, it is Visa and PayPal who provide the security to the services they provide. But no one owns Bitcoin. No one intrinsically has the incentive to make sure it's safe. This could be a problem.&lt;/p&gt;

&lt;p&gt;So a decentralized method of providing security was invented and made the lifeblood of Bitcoin. Instead of one person or entity handling security, now it's everyone's responsibility. That's what mining is—a decentralized security mechanism.&lt;/p&gt;

&lt;p&gt;The mining process consists of collecting transactions broadcasted on the network and putting them into a block to be verified. &lt;/p&gt;

&lt;p&gt;Miners have alternative methods, often referred to as "out-of-band," for receiving transactions. These include direct transactions sent to miners or utilizing services such as mempool.space, Twitter, or nostr. However, the primary and preferred source is the peer-to-peer (P2P) network. It is crucial to maintain this reliance on the P2P network to mitigate the risks associated with mining centralization. Encouraging transaction propagation through the P2P network ensures a decentralized and robust system, reinforcing the principles of security and integrity within the mining ecosystem.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Bitcoin Mining: The Core Process&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Collecting Transactions and Building Blocks&lt;/strong&gt;&lt;br&gt;
The first step in mining is gathering transactions broadcasted on the Bitcoin network. These transactions represent transfers of Bitcoin between different users. Miners collect these transactions and group them into a new "block." This block becomes a permanent record of these transactions on the blockchain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Crucial Role of Proof of Work (PoW)&lt;/strong&gt;&lt;br&gt;
The central element of Bitcoin mining is the PoW algorithm. This complex mathematical puzzle acts as a security measure by making it computationally difficult to create new blocks. This difficulty discourages malicious actors from attempting to manipulate the blockchain, ensuring its integrity and stability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solving the Puzzle: Miners vs. Algorithms&lt;/strong&gt;&lt;br&gt;
Miners compete to solve the PoW puzzle by taking specific data, including the collected transactions, and running it through a hashing algorithm (SHA-256 in Bitcoin's case). They also include a random number called a "nonce" in the hashing process. The goal is to find a nonce that generates a hash with a specific number of leading zeroes, determined by the current network difficulty. This difficulty automatically adjusts based on mining activity, ensuring a consistent block creation rate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Trial and Error of Mining&lt;/strong&gt;&lt;br&gt;
Finding a valid hash is a computationally intensive process. Miners constantly adjust the nonce and re-run the hashing algorithm, hoping to hit the target. This trial and error can take hours or even days, depending on individual mining power. Specialized hardware called "mining rigs" hash at incredible speeds, increasing the chances of finding a valid block.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Success! But the Work Never Stops&lt;/strong&gt;&lt;br&gt;
When a miner successfully solves the PoW puzzle, they create a new block, adding it to the blockchain and earning a reward in Bitcoin. However, the mining process is never truly finished. New transactions constantly appear, requiring more blocks to be created and verified, ensuring the smooth operation and security of the Bitcoin network.&lt;/p&gt;

&lt;p&gt;Upon a successful mine, the miner receives a reward of bitcoins. Bitcoin miners are rewarded with new bitcoins for their efforts. As of February 2024, the reward is 6.25 bitcoins per block. The block reward is halved every 210,000 blocks or approximately every four years.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Bitcoin Mining Attacks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Bitcoin mining attacks refer to various malicious activities targeting the cryptocurrency mining process. Some common types of attacks related to Bitcoin mining are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;51% Attack:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sybil Attack:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Eclipse Attack:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Selfish Mining:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Application-Specific Integrated Circuits(ASIC) Hardware Vulnerabilities, and so on&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The 51% Attacks&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;According to Investopedia "A 51% attack is an attack on a cryptocurrency blockchain by a group of miners who control more than 50% of the network's mining hash rate". &lt;/p&gt;

&lt;p&gt;Imagine you're playing a voting game with your friends to decide what movie to watch. Everyone votes anonymously, and the majority vote wins. This is similar to how Bitcoin mining works, where miners vote on valid transactions through their computing power.&lt;/p&gt;

&lt;p&gt;Now, imagine one player (or a group of friends) secretly buys a bunch of extra votes (more computing power). Suddenly, their vote counts way more than anyone else's! This is essentially what happens in a 51% attack on Bitcoin mining:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Gaining Control: A malicious actor gets over 50% of the mining power (voting power). This could be done by renting a lot of computing power or hijacking existing miners.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Messing with the System: With this majority, they can:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Block transactions:&lt;/strong&gt; They can prevent certain transactions from being confirmed, effectively stopping them.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Double-spend:&lt;/strong&gt; They can create fake transactions, spend the same Bitcoin twice, and get away with it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Change the past:&lt;/strong&gt; In rare cases, they could rewrite parts of the transaction history, but this is very difficult and risky.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2xc5vamkgyaff9dpg1q0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2xc5vamkgyaff9dpg1q0.png" alt="51% attack" width="800" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Has there been a successful 51% Attack on the Bitcoin Network?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The answer is &lt;strong&gt;NO&lt;/strong&gt;. While smaller cryptocurrencies and forks of Bitcoin have been targeted, the immense cost and resources needed to attack the Bitcoin network have so far deterred any attempts.&lt;/p&gt;

&lt;p&gt;Here's a breakdown of why a 51% attack on Bitcoin remains highly unlikely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Massive Computing Power Required:&lt;/strong&gt; Controlling 51% of the Bitcoin network's hash rate would require access to a huge amount of specialized hardware and significant electricity to power it. As of February 2024, estimates suggest this would cost billions of dollars, making it a daunting financial undertaking.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Network Difficulty Adjustment:&lt;/strong&gt; The Bitcoin network automatically adjusts its difficulty based on the total mining power, making it harder to solve blocks as more miners join. This increases the cost and effort required to achieve a 51% attack as the network grows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Decentralized Nature:&lt;/strong&gt; Bitcoin's decentralized structure further complicates such attempts. Attackers wouldn't just need to control mining power but also convince other miners to follow their malicious version of the blockchain, which is highly unlikely given the extensive security measures in place.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community Monitoring:&lt;/strong&gt; The Bitcoin community actively monitors the network for suspicious activity, making it difficult for an attacker to remain undetected for long. Any attempt to manipulate the network would likely be identified and countered quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Economic Disincentive:&lt;/strong&gt; Successfully manipulating transactions for personal gain wouldn't necessarily benefit the attacker in the long run. The entire value of Bitcoin relies on its trust and security, and a successful attack would likely damage its reputation and value, ultimately hurting the attacker as well.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;While the possibility of a future attack should never be completely dismissed, the significant barriers and potential negative consequences make it highly unlikely for Bitcoin to fall victim to a 51% attack in the foreseeable future. &lt;/p&gt;

&lt;p&gt;In conclusion, a 51% attack undermines the whole system's trust and security. People might lose confidence in Bitcoin if they think someone can manipulate it. As such, there is a need for continued improvements in the network's security and community vigilance which will further strengthen this resistance.&lt;/p&gt;

</description>
      <category>bitcoin</category>
      <category>mining</category>
      <category>blockchain</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Creating a Bitcoin Address in Golang with btcd</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Tue, 30 Jan 2024 15:30:30 +0000</pubDate>
      <link>https://dev.to/vivcis/creating-a-bitcoin-address-in-golang-with-btcd-1m6k</link>
      <guid>https://dev.to/vivcis/creating-a-bitcoin-address-in-golang-with-btcd-1m6k</guid>
      <description>&lt;p&gt;Imagine bitcoin as digital cash. To receive it, you need a unique identifier called a bitcoin address. You can share this address publicly to receive payments. &lt;br&gt;
But how do you access and manage your Bitcoin? That's where a Bitcoin wallet comes in.&lt;br&gt;
It's like a secure digital container that holds your keys and allows you to send bitcoin, receive bitcoin, and track how many bitcoins were sent to your address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is a bitcoin address?&lt;/strong&gt;&lt;br&gt;
A Bitcoin address is a unique identifier used to receive or send bitcoin in the Bitcoin network. &lt;br&gt;
You can use it to receive or request payments. It is typically a string of letters and numbers, and it plays a role similar to an account number in traditional banking. &lt;br&gt;
Keep in mind that a Bitcoin address is just one part of a Bitcoin wallet, which also includes private keys, which is a cryptographically generated random number that allows you to spend the bitcoin sent to your bitcoin addresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Different types&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Legacy Addresses (P2PKH): These are traditional Bitcoin addresses that start with a '1'. They are derived from the public key and are widely used. For example, a legacy address might look like: &lt;code&gt;1BvBMSEYstWetqTFn5Au4m4GFg7xJaNVN2&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Segregated Witness (SegWit) Addresses (bech32 encoding format): SegWit is an upgrade to the Bitcoin protocol that makes various changes to the protocol one of such is introducing a new bitcoin address format called segwit addresses.&lt;br&gt;
SegWit addresses have 32 characters, which comprise lowercase letters a-z and numbers 0-9, it starts with '3' and are more space-efficient, resulting in lower transaction fees. For example, a SegWit address might look like: &lt;code&gt;3J98t1WpEZ73CNmQviecrnyiWrnqRhWNLy&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A private key is a secret, alphanumeric string that allows you to access and control the funds associated with a specific public address.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NB&lt;/strong&gt;:&lt;br&gt;
Keep your private keys safe, like your regular wallet's pin.&lt;br&gt;
Never share your private keys with anyone!&lt;/p&gt;

&lt;p&gt;Let's dive into it&lt;br&gt;
&lt;strong&gt;Requirements&lt;/strong&gt;&lt;br&gt;
Ensure you have go installed&lt;/p&gt;

&lt;p&gt;on MacOs&lt;br&gt;
&lt;code&gt;brew install go&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Verify the installation &lt;br&gt;
&lt;code&gt;go version&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
on Windows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Download the MSI installer from the &lt;a href="https://go.dev/doc/install"&gt;official Golang 
website&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Run the installer and follow the installation prompts.&lt;/li&gt;
&lt;li&gt;Open a new Command Prompt or PowerShell window, and verify 
the installation by running 
&lt;code&gt;go version&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Set Up Your Go Module&lt;/strong&gt;&lt;br&gt;
a. Open your terminal.&lt;br&gt;
b. Create a new folder for your project: &lt;br&gt;
&lt;code&gt;mkdir btc-wallet- generator&lt;/code&gt;&lt;br&gt;
c. Change into the project directory: &lt;br&gt;
&lt;code&gt;cd btc-wallet-generator&lt;/code&gt;&lt;br&gt;
d. Create a new Go module: &lt;br&gt;
&lt;code&gt;go mod init btc-wallet-generator&lt;/code&gt;&lt;br&gt;
e. Run &lt;code&gt;go mod tidy&lt;/code&gt; to clean up and update dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Install Dependencies&lt;/strong&gt;&lt;br&gt;
Run the following command to install the btcd library, which is used for wallet generation:&lt;br&gt;
&lt;code&gt;go get github.com/btcsuite/btcd@v0.22.1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Create main.go File&lt;/strong&gt;&lt;br&gt;
Create a main.go file in your project folder and add the following content below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package main

import (
    "encoding/hex"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"

    "github.com/btcsuite/btcd/chaincfg"
    "github.com/btcsuite/btcd/btcec"
    "github.com/btcsuite/btcutil"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 4: Write the Main Function&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;func main() {
    createP2PKHAddress()
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 5: Generate P2PKH Address Function&lt;/strong&gt;&lt;br&gt;
Add the createP2PKHAddress function to your main.go file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func createP2PKHAddress() {
    // Choose the Bitcoin network (testnet in this case)
    params := &amp;amp;chaincfg.TestNet3Params

    // Generate a new private key
    privKey, err := btcec.NewPrivateKey(btcec.S256())
    if err != nil {
        log.Fatal(err)
    }

    // Get the corresponding public key
    pubKey := privKey.PubKey()

    // Create a P2PKH address
    addr, err := btcutil.NewAddressPubKeyHash(btcutil.Hash160(pubKey.SerializeCompressed()), params)
    if err != nil {
        log.Fatal(err)
    }

    // Display the generated address and private key
    fmt.Printf("| Public Address | %s |\n", addr.EncodeAddress())
    fmt.Printf("| Private Key     | %s |\n", hex.EncodeToString(privKey.Serialize()))

    // Save the wallet information to a JSON file
    wallet := map[string]string{
        "address":    addr.EncodeAddress(),
        "privateKey": hex.EncodeToString(privKey.Serialize()),
    }

// Serialize wallet information to JSON format with indentation
walletJSON, err := json.MarshalIndent(wallet, "", "    ")
if err != nil {
    log.Fatal(err)
}

// Write the serialized JSON to a file named "wallet.json" //with read-write permissions (0644)
err = ioutil.WriteFile("wallet.json", walletJSON, 0644)
if err != nil {
    log.Fatal(err)
}

// Print a message indicating that the wallet has been created //and saved to "wallet.json"
fmt.Println("Address created and saved to wallet.json")
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 6: Run the Program&lt;/strong&gt;&lt;br&gt;
Run the following command in your terminal to compile and execute the Go program:&lt;br&gt;
&lt;code&gt;go run main.go&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 7: Check Your Address on Mempool&lt;/strong&gt;&lt;br&gt;
The program will generate a public address and private key, save them to wallet.json, and display a message. Copy the generated address and visit &lt;a href="https://coinfaucet.eu/en/btc-testnet/"&gt;coinfaucet&lt;/a&gt; to get free bitcoin which in this case is just for testing purposes. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29lrof8b0gazt539sqio.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F29lrof8b0gazt539sqio.png" alt="Image description" width="800" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After receiving some funds, check your UTXO and other information on &lt;a href="https://mempool.space/testnet/address/mkVQwZz9WXBz7nuhQQLdqfa8xuz1kKX6Ht"&gt;mempool-testnet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybhjl02pg3gtyqancq4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fybhjl02pg3gtyqancq4c.png" alt="Image description" width="800" height="375"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In conclusion, this article aims to guide developers through the process of setting up a development environment, using btcd, writing Golang code, and testing a basic Bitcoin address.&lt;/p&gt;

</description>
      <category>go</category>
      <category>bitcoin</category>
      <category>tutorial</category>
      <category>wallet</category>
    </item>
    <item>
      <title>Career Opportunities as an Open-source contributor</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Fri, 17 Feb 2023 08:52:24 +0000</pubDate>
      <link>https://dev.to/vivcis/career-opportunities-as-an-open-source-contributor-46ma</link>
      <guid>https://dev.to/vivcis/career-opportunities-as-an-open-source-contributor-46ma</guid>
      <description>&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%2Fd2uiobz8wgbgq68uvvda.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%2Fd2uiobz8wgbgq68uvvda.jpeg" alt="open-source jpeg" width="612" height="408"&gt;&lt;/a&gt;&lt;br&gt;
Open-source software refers to software whose source code is publicly available and can be modified and distributed by anyone. Contributing to open-source projects can be a valuable way to gain experience and develop skills, as well as to demonstrate your abilities to potential employers.&lt;/p&gt;

&lt;p&gt;There are many ways to contribute to open-source projects, and not all of them require programming skills. Some examples of ways to contribute include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Technical writing and documentation: Open-source projects often require documentation, user guides, and other written materials to help users understand how to use the software. Technical writers can contribute by writing and editing these materials.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bug reporting and testing: Users of open-source software can help improve the software by reporting bugs and issues they encounter, as well as testing new features and releases.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;User experience design: User experience (UX) designers can contribute to open-source projects by designing user interfaces and improving the overall usability of the software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Community management: Open-source projects require active communities to thrive, and community managers can contribute by organizing events, moderating online forums, and promoting the project.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In addition to the skills you can gain by contributing to open-source projects, there are also many career opportunities in the open-source space. Some of these include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open-source software development: Many companies use open-source software in their products and services, and they need developers who are familiar with the software to customize and maintain it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DevOps: DevOps is a field that focuses on software development and operations, and it often involves using open-source tools and technologies to build and deploy software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Technical writing and documentation: As mentioned earlier, open-source projects often require documentation and user guides, so technical writers with experience in open-source software can find job opportunities in this field.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Community management: Companies that develop and use open-source software often need community managers to engage with users, promote the project, and build a strong community around the software.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Also, some open-source projects offer paid internships and other opportunities for contributors. &lt;a href="https://www.outreachy.org/" rel="noopener noreferrer"&gt;Outreachy&lt;/a&gt;, for example, is a program that provides paid internships to people from underrepresented groups who want to contribute to open-source projects. &lt;a href="https://www.linuxfoundation.org/" rel="noopener noreferrer"&gt;The Linux Foundation&lt;/a&gt; also offers mentorship programs and other opportunities for people interested in open-source software.&lt;/p&gt;

&lt;p&gt;If you're interested in finding paid opportunities to contribute to open-source projects, you can check out this &lt;a href="https://navendu.me/posts/open-source-internship-programs/#linux-foundation-mentorship-program-lfx" rel="noopener noreferrer"&gt;paid opportunities&lt;/a&gt;. It provides a compilation of open-source projects that offer paid internships and mentorship programs.&lt;/p&gt;

&lt;p&gt;Overall, contributing to open-source projects can be a great way to build skills, network with other professionals, and explore career opportunities in the tech industry.&lt;/p&gt;

</description>
      <category>career</category>
      <category>remote</category>
      <category>offers</category>
    </item>
    <item>
      <title>Mid-Point Project Progress: Reflecting on My Outreachy Internship Experience</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Fri, 27 Jan 2023 01:11:37 +0000</pubDate>
      <link>https://dev.to/vivcis/mid-point-project-progress-reflecting-on-my-outreachy-internship-experience-gfp</link>
      <guid>https://dev.to/vivcis/mid-point-project-progress-reflecting-on-my-outreachy-internship-experience-gfp</guid>
      <description>&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%2Fg1xs8yax36fdomujzesa.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%2Fg1xs8yax36fdomujzesa.jpeg" alt="progress bar" width="800" height="424"&gt;&lt;/a&gt;&lt;br&gt;
As an Outreachy intern working on the &lt;a href="https://www.torproject.org/download/" rel="noopener noreferrer"&gt;Tor Browser project&lt;/a&gt;, I have reached the mid-point of my internship, and it's been a challenging and rewarding experience so far. For those who may not be familiar, Outreachy is a program that provides internships for underrepresented groups in technology, including women, people of color, and members of the LGBTQ+ community.&lt;/p&gt;

&lt;p&gt;When I first applied for the program, I had no experience with open-source development and was nervous about my ability to contribute to such a high-profile project. However, with the support of my mentors, the Tor Browser community, the Outreachy Community Administrators (Omotola, Sage, and Anna), and the other Outreachy interns, I have been able to make meaningful contributions to the project, improve my technical skills, and Interpersonal skills.&lt;/p&gt;

&lt;p&gt;My main project for the internship is to extend GetTor, a service that allows users to download the Tor Browser on censored networks over instant messaging and social media platforms. This involves working with a variety of technologies, including Golang, WhatsApp  API, writing tests, and so on.&lt;/p&gt;

&lt;p&gt;One of the biggest challenges I've faced so far is understanding the codebase and development process of the Tor Browser. As someone who is new to open-source development, it can be overwhelming to navigate a large and complex codebase. However, by asking questions and seeking help from my mentor and the community, I have been able to gain a better understanding of the project and make progress on my task.&lt;/p&gt;

&lt;p&gt;Another challenge I've faced is dealing with the uncertainty and ambiguity that comes with working on an open-source project. In a traditional work setting, there are often clear expectations and deadlines, but in open-source development, things can be more fluid. This can be frustrating at times, but it has also taught me the importance of communication, flexibility, and patience.&lt;/p&gt;

&lt;p&gt;Despite these challenges, I have also had many positive experiences during my internship. One of the most rewarding aspects has been seeing my contributions merge into the main codebase and knowing that they will be used by real users to access the internet safely and anonymously.&lt;/p&gt;

&lt;p&gt;Additionally, I have had the opportunity to learn from and collaborate with a diverse group of people from all over the world. The Tor Browser community is a welcoming and supportive group, and it has been a privilege to be a part of it.&lt;/p&gt;

&lt;p&gt;As I move into the second half of my internship, I am looking forward to continuing my work on GetTor and exploring other areas of the project. I am also excited to continue learning and growing as a developer and open-source contributor. I would like to thank my mentor(Meskio) and the project manager(Gaba), the Tor Browser community, and the Outreachy program for giving me this opportunity and supporting me along the way.&lt;/p&gt;

&lt;p&gt;In conclusion, My mid-point experience has been a challenging but rewarding one. I have faced many obstacles, but with the support of my mentors, and the Tor Browser community, I have been able to make meaningful contributions to the project and improve my technical skills. I am excited to see what the next half of my internship holds and I am looking forward to continuing my work on GetTor and exploring other areas of the project.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>"Think About Your Audience" [Extend Gettor Browser]</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Fri, 06 Jan 2023 12:55:59 +0000</pubDate>
      <link>https://dev.to/vivcis/think-about-your-audience-extend-gettor-browser-2904</link>
      <guid>https://dev.to/vivcis/think-about-your-audience-extend-gettor-browser-2904</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fWgFDdW1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wag388d8bpyzdgzzdm5v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fWgFDdW1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wag388d8bpyzdgzzdm5v.jpg" alt="audience" width="880" height="587"&gt;&lt;/a&gt;&lt;br&gt;
My audience in this case refers to you reading this blog post about the Tor browser. In this post, I want to break down some terms that were difficult for me to understand when I joined the project newly and this is me putting myself in your shoes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Tor Browser?
&lt;/h2&gt;

&lt;p&gt;TorBrowser is often used to access censored content, and because of that some countries or network operators block access to the downloads in torproject.org. A mechanism we have to avoid those blocks is GetTor:&lt;a href="https://gettor.torproject.org/"&gt;gettor browser&lt;/a&gt;. The Tor Browser is a free open-source internet anonymity tool created as a response to online censorship. By sending your data through a network of volunteer servers, it hides your IP from the destination server and hides the destination server IP from your ISP. As a result, the Tor browser is a great tool to unblock sites.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a censor?
&lt;/h2&gt;

&lt;p&gt;According to vocabulary.com, To "censor" is to review something and to choose to remove or hide parts of it that are considered unacceptable. Censorship is the name for the process or idea of keeping things like obscene words or graphic images from an audience. There is also such a thing as self-censorship, which is when you refrain from saying certain things — or possibly re-wording them — depending on who is listening. Internet censorship is the legal control or suppression of what can be accessed, published, or viewed on the Internet. Censorship is most often applied to specific internet domains (such as Wikipedia.org) but exceptionally may extend to all Internet resources located outside the jurisdiction of the censoring state.&lt;/p&gt;

&lt;p&gt;Censored content can be measured using &lt;a href="https://ooni.org/"&gt;OONI&lt;/a&gt; (Open Observatory of Network Interference). You can install the OONI Probe on a mobile device or desktop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JDrudnw7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqm5f37z5f0lvhpol0k6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JDrudnw7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dqm5f37z5f0lvhpol0k6.png" alt="OONI Probe" width="880" height="545"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IumaHpyi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/besmgfkhjvd8gnw83nq4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IumaHpyi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/besmgfkhjvd8gnw83nq4.png" alt="OONI Probe" width="880" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am contributing to
&lt;/h2&gt;

&lt;p&gt;My team [#tor-anticensorship] works to extend GetTor to distribute TorBrowser on other IM and social media (like Twitter, iMessage, or WhatsApp). My first task included extending Gettor either on WhatsApp or on Twitter. I choose WhatsApp cause I am from Nigeria and here we have a lot of demography using Whatsapp cause of its simplicity. Currently, I created a dummy WhatsApp bot which will be used to extend gettor to share links over WhatsApp.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here are once again some of the key terms you should be familiar with:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Censorship:&lt;/strong&gt; The act of suppressing or prohibiting the free expression of ideas, thoughts, or information. In the context of the Tor browser, censorship can refer to the efforts of governments or other organizations to block access to certain websites or restrict the ability of users to communicate freely online.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Anonymity:&lt;/strong&gt; The state of being unidentified or unknown. In the context of the Tor browser, anonymity refers to the ability of users to protect their online identity and activities from being traced or monitored.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Encryption:&lt;/strong&gt; The process of converting data into a form that is unreadable without a special key or password. Encryption is used to protect the privacy and security of online communications, including those made through the Tor browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onion routing:&lt;/strong&gt; A technique for anonymous communication over a computer network, in which messages are passed through multiple layers of encryption to hide the identity of the sender and recipient. Onion routing is used by the Tor network to protect the privacy of its users.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exit node:&lt;/strong&gt; A computer on the Tor network that forwards traffic from the network to the regular Internet. Exit nodes play a critical role in the anonymity of the Tor network, as they are the last point at which the traffic is encrypted and can be traced back to the user.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;By understanding these terms and concepts, you will be better equipped to navigate the technical challenges of working on the Tor browser and contribute to the development of a powerful tool for online privacy and freedom of expression.&lt;/p&gt;

&lt;p&gt;PS: Kindly drop a comment in the comment box if you need clarification on anything relating to the Tor browser.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>go</category>
      <category>outreachy</category>
      <category>torbrowser</category>
    </item>
    <item>
      <title>"Everybody struggles"</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Sat, 24 Dec 2022 16:57:29 +0000</pubDate>
      <link>https://dev.to/vivcis/everybody-struggles-1085</link>
      <guid>https://dev.to/vivcis/everybody-struggles-1085</guid>
      <description>&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%2Fulfvsx6e45hwqd1bym4t.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%2Fulfvsx6e45hwqd1bym4t.jpeg" alt="struggle" width="800" height="679"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I am an Outreachy intern (3 weeks now, wow!) working on the &lt;a href="https://www.torproject.org/download/" rel="noopener noreferrer"&gt;Tor Browser&lt;/a&gt;, a free and open-source software project that allows users to browse the internet anonymously but particularly to Extend GetTor to distribute TorBrowser on censored networks over IM and social media. I have come to realize that everyone struggles at some point in their career. No matter how skilled or experienced you are, there will always be challenges and obstacles that you need to overcome. Moreso, for someone just starting out professionally, the feeling of inadequacy is extremely poignant.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What are my struggles?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;So... my struggle initially when I came on the project was running the codebase but what helped me a lot is asking questions, then came the problem of understanding the entire codebase and what is happening which if I am been sincere I still do not totally know what is happening but I just focus on what I am working on what is happening there.&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%2F1y8hymy9nmkik81rqvl1.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%2F1y8hymy9nmkik81rqvl1.jpeg" alt="A trip takes us" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
As an intern, I have struggled with understanding complex technical concepts(I use Google most time) and getting up to speed on the project's development process. These struggles are natural and are a part of the learning and growth process as I have been told during the live chats on the Outreachy community channel.&lt;/p&gt;

&lt;p&gt;One thing that has helped me to cope with these struggles is to remember that I am not alone. Every developer, no matter their level of expertise, goes through similar struggles. It's important to seek out support from colleagues and mentors (of which my mentor "meskio" and the other community members have been of immense help) and to remember that it's okay to ask for help.&lt;/p&gt;

&lt;p&gt;Another thing that is helping me to overcome my struggles is keeping an open mind and a positive attitude. It's easy to get discouraged when things don't go as planned, but it's important to stay focused and to keep trying. By approaching challenges with a positive attitude, I have been able to find solutions and make progress in my work.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What's Next?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Despite the challenges that I have faced, I am learning a lot during my time as an intern with the &lt;a href="https://www.torproject.org/download/" rel="noopener noreferrer"&gt;Tor Browser&lt;/a&gt;, and I am grateful for the opportunity to be a part of this amazing open-source project. I hope that by sharing my experiences, I can encourage others to embrace their struggles and to keep pushing forward, no matter how difficult things may seem.&lt;/p&gt;

&lt;p&gt;As I continue to work on the Tor Browser, I am looking forward to learning even more and contributing to the project in meaningful ways. I am excited to see where my journey as an intern takes me and to see what the future holds for me in the world of open-source software development.&lt;/p&gt;

</description>
      <category>tutorial</category>
    </item>
    <item>
      <title>Introducing Cecilia</title>
      <dc:creator>ORJI CECILIA O.</dc:creator>
      <pubDate>Fri, 09 Dec 2022 11:18:08 +0000</pubDate>
      <link>https://dev.to/vivcis/introducing-cecilia-35jc</link>
      <guid>https://dev.to/vivcis/introducing-cecilia-35jc</guid>
      <description>&lt;p&gt;&lt;strong&gt;A bit about myself&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%2Fl0p6ug9790vj3g6bf3mz.jpg" 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%2Fl0p6ug9790vj3g6bf3mz.jpg" alt="introduction" width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;My name is Orji Cecilia Olanma, a graduate of the University of Lagos Nigeria and, studied Geography and Planning. I got introduced to Programming by one of my best friend Azuma Margret. I remember returning back from Youth Service and I had gone to her place, she just got accepted to Andela and she was gisting me about it and the opportunities one can get as a Software Developer.&lt;/p&gt;

&lt;p&gt;I attended a 4 weeks Bootcamp with She Hacks Africa under the WAAW (Working to Advance STEM Education for African Women) Foundation where I learned HTML5, CSS3, JavaScript, and a little bit of Nodejs. I went to work with OPAy as a customer support agent for almost 3 years but while working I continued learning and enrolled in some virtual internships like start.ng, HNG, DevCareer and Progate, Zuri &amp;amp; Ingressive 4 Good. I applied to Decagon and got accepted in January 2022 so I had to leave my job and face it fully. At Decagon, I focused on Golang and React.js but I am more backend-heavy.&lt;/p&gt;

&lt;p&gt;My areas of interest include web3, Blockchain, Open-source contribution, and Cloud Computing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My core values&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%2F8k9jntnjnfbsts8srufo.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%2F8k9jntnjnfbsts8srufo.jpeg" alt="core values" width="761" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3 major core values important to me are;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community&lt;/strong&gt;: This is because this represents family, a support system. Family is an institution that matters very much to me. I believe that your family can never put you away. Development in society starts from the unit called family. Our world will become a better place if every family takes responsibility for the individuals that form a part of it. The support that a family gives cannot be underestimated. This support goes a long way in creating mental structures that motivates you to become whatever you want to be. This support also often translates to an undiluted belief in your capabilities, which gives is comforting to know that there are people who are ready to do their best to ensure your success. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Kindness&lt;/strong&gt;: According to the Oxford dictionary, It is " the quality of being friendly, generous, and considerate". I believe if we all can be just a little bit kind to our neighbors the world will be a better place. We already have a lot going on in the world (Climate change, floods, drought, eruptions, etc). &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service&lt;/strong&gt;:  I believe in service and giving back to society. This quote by Albert Einstein: &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;"It is every man’s obligation to put back into the world at least, an equivalent of what he takes out of it"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;is my mantra and motivation for giving back to the community, and for affecting the lives of girls through active empowerment. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What motivated me to apply to Outreachy&lt;/strong&gt;&lt;br&gt;
Hmmm... It was cause I have always been interested in contributing to Open-source projects and remember one of my core values listed above is service and giving back after receiving so much from the earth and people in general. &lt;/p&gt;

&lt;p&gt;I got introduced by a friend to Outreachy and I remember adding my mail to the mailing list and waiting for the next application. I applied, passed to the contribution stage, and chose&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%2F97tu3auefwyoq7jxstq7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F97tu3auefwyoq7jxstq7.png" alt="Tor Browser" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.torproject.org/" rel="noopener noreferrer"&gt;Tor Project&lt;/a&gt; ( Extend GetTor to distribute TorBrowser on censored networks over IM and social media) as the project I want to contribute to as it aligns with my values. I made my first contribution and the merging of my pull request gave me immense joy. Eventually, I got accepted as an Outreachy intern!&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
