<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Smelli_Mi</title>
        <link>https://paragraph.com/@smelli-mi</link>
        <description>Learning to become a Web3 Developer.  </description>
        <lastBuildDate>Mon, 21 Sep 2026 23:16:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <copyright>All rights reserved</copyright>
        <item>
            <title><![CDATA[Week1 - Road to Web3]]></title>
            <link>https://paragraph.com/@smelli-mi/week1-road-to-web3</link>
            <guid>yb9i90yJJ5mliaV0H8Zi</guid>
            <pubDate>Fri, 04 Nov 2022 14:03:03 GMT</pubDate>
            <description><![CDATA[https://university.alchemy.com/Who are you, and what is your software development background? My name is Yong and I recently pivot into software development coming from an accounting background. I’ve self-studied for several months now using many free resources available online and was lucky to discover Alchemy University through Chainshot.Why did you want to complete this lesson? To better understand how exactly are NFTs created. The step by step walkthrough including the max limitations of ...]]></description>
            <content:encoded><![CDATA[<p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://university.alchemy.com/">https://university.alchemy.com/</a></p><ul><li><p>Who are you, and what is your software development background?</p><p><em>My name is Yong and I recently pivot into software development coming from an accounting background. I’ve self-studied for several months now using many free resources available online and was lucky to discover Alchemy University through Chainshot.</em></p></li><li><p>Why did you want to complete this lesson?</p><p><em>To better understand how exactly are NFTs created. The step by step walkthrough including the max limitations of total NFT and max per wallet on the smart contract was something new for me. Diving in into the metadata show me possibilities of bridging the unique characteristics of NFT with the real world.</em></p></li><li><p>When did you complete the project?</p><p><em>I completed the project on November 4th, 2022.</em></p></li><li><p>What technologies did you use?</p><p><em>To complete the project I used OpenZeppelin, Remix, Filebase, and an online JSON editor.</em></p></li><li><p>What did you enjoy about the tutorial?</p><p><em>Introducing all the available technologies out there that simplified the overall process of minting NFTs. Providing a video as well as a written tutorial really help with solidifying the topic and made me better understand the overall objective.</em></p></li><li><p>How do you think you can use this technology to build useful applications in the future? What are some specific example applications?</p><p><em>One useful applications that came to mind is minting of a NFT with every real world item purchase. An example would be a luxury handbag, where a NFT is minted when the first owner purchased the item. The owner can use the NFT on social media as Clout or can sell the NFT in the open market as they wish. Another use case could be that the NFT is an actual item in the virtual metaverse and the owner can equip the same handbag on their avatar virtually.</em></p></li><li><p>Who would you recommend this project to?</p><p><em>I would recommend this project to anyone interested in learning more about Web3 and NFTs.</em></p></li><li><p>What is the Ethereum wallet address you would like to receive your PoK at?</p><p><em>0xE3247b11dE61f544485F909eA597C1d035B560b9</em></p></li><li><p>Below are Links:</p><p>- Contract Address / etherscan link</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://goerli.etherscan.io/address/0xa31b318e30cf63a0c5d9856238642a468c7cb412">https://goerli.etherscan.io/address/0xa31b318e30cf63a0c5d9856238642a468c7cb412</a></p><p>- OpenSea/Rarible/other NFT link</p><p><a target="_blank" rel="noopener noreferrer nofollow ugc" class="dont-break-out" href="https://testnets.opensea.io/collection/baobaomi">https://testnets.opensea.io/collection/baobaomi</a></p><p>- a screenshot of your deployed NFT (e.g. in OpenSea)</p></li></ul><figure float="none" data-type="figure" class="img-center" style="max-width: null;"><img src="https://storage.googleapis.com/papyrus_images/74eb88fdd1aaf685d41da00f82b48d2f30ac1308d0701f66d92c6bade653fdf5.png" alt="" blurdataurl="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACwAAAAAAQABAAACAkQBADs=" nextheight="600" nextwidth="800" class="image-node embed"><figcaption HTMLAttributes="[object Object]" class="hide-figcaption"></figcaption></figure><p>- Contract Code:</p><pre data-type="codeBlock" text="// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import &quot;@openzeppelin/contracts@4.7.3/token/ERC721/ERC721.sol&quot;;
import &quot;@openzeppelin/contracts@4.7.3/token/ERC721/extensions/ERC721Enumerable.sol&quot;;
import &quot;@openzeppelin/contracts@4.7.3/token/ERC721/extensions/ERC721URIStorage.sol&quot;;
import &quot;@openzeppelin/contracts@4.7.3/utils/Counters.sol&quot;;

contract BaoBaoMi is ERC721, ERC721Enumerable, ERC721URIStorage {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenIdCounter;
    uint256 MAX_SUPPLY = 10000;
    uint256 MAX_PER_WALLET = 5;

    constructor() ERC721(&quot;BaoBaoMi&quot;, &quot;BBM&quot;) {}

    function safeMint(address to, string memory uri) public {
        uint256 tokenId = _tokenIdCounter.current();
        require(tokenId &lt; MAX_SUPPLY, &quot;I&apos;m sorry all NFTs have been minted.&quot;);
        require(balanceOf(to) &lt; MAX_PER_WALLET, &quot;You have reached the maximum number of NFTs per wallet.&quot;);
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}
"><code><span class="hljs-comment">// SPDX-License-Identifier: MIT</span>
<span class="hljs-meta"><span class="hljs-keyword">pragma</span> <span class="hljs-keyword">solidity</span> ^0.8.4;</span>

<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts@4.7.3/token/ERC721/ERC721.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts@4.7.3/token/ERC721/extensions/ERC721Enumerable.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts@4.7.3/token/ERC721/extensions/ERC721URIStorage.sol"</span>;
<span class="hljs-keyword">import</span> <span class="hljs-string">"@openzeppelin/contracts@4.7.3/utils/Counters.sol"</span>;

<span class="hljs-class"><span class="hljs-keyword">contract</span> <span class="hljs-title">BaoBaoMi</span> <span class="hljs-keyword">is</span> <span class="hljs-title">ERC721</span>, <span class="hljs-title">ERC721Enumerable</span>, <span class="hljs-title">ERC721URIStorage</span> </span>{
    <span class="hljs-keyword">using</span> <span class="hljs-title">Counters</span> <span class="hljs-title"><span class="hljs-keyword">for</span></span> <span class="hljs-title">Counters</span>.<span class="hljs-title">Counter</span>;

    Counters.Counter <span class="hljs-keyword">private</span> _tokenIdCounter;
    <span class="hljs-keyword">uint256</span> MAX_SUPPLY <span class="hljs-operator">=</span> <span class="hljs-number">10000</span>;
    <span class="hljs-keyword">uint256</span> MAX_PER_WALLET <span class="hljs-operator">=</span> <span class="hljs-number">5</span>;

    <span class="hljs-function"><span class="hljs-keyword">constructor</span>(<span class="hljs-params"></span>) <span class="hljs-title">ERC721</span>(<span class="hljs-params"><span class="hljs-string">"BaoBaoMi"</span>, <span class="hljs-string">"BBM"</span></span>) </span>{}

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">safeMint</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> to, <span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span> uri</span>) <span class="hljs-title"><span class="hljs-keyword">public</span></span> </span>{
        <span class="hljs-keyword">uint256</span> tokenId <span class="hljs-operator">=</span> _tokenIdCounter.current();
        <span class="hljs-built_in">require</span>(tokenId <span class="hljs-operator">&#x3C;</span> MAX_SUPPLY, <span class="hljs-string">"I'm sorry all NFTs have been minted."</span>);
        <span class="hljs-built_in">require</span>(balanceOf(to) <span class="hljs-operator">&#x3C;</span> MAX_PER_WALLET, <span class="hljs-string">"You have reached the maximum number of NFTs per wallet."</span>);
        _tokenIdCounter.increment();
        _safeMint(to, tokenId);
        _setTokenURI(tokenId, uri);
    }

    <span class="hljs-comment">// The following functions are overrides required by Solidity.</span>

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_beforeTokenTransfer</span>(<span class="hljs-params"><span class="hljs-keyword">address</span> <span class="hljs-keyword">from</span>, <span class="hljs-keyword">address</span> to, <span class="hljs-keyword">uint256</span> tokenId</span>)
        <span class="hljs-title"><span class="hljs-keyword">internal</span></span>
        <span class="hljs-title"><span class="hljs-keyword">override</span></span>(<span class="hljs-params">ERC721, ERC721Enumerable</span>)
    </span>{
        <span class="hljs-built_in">super</span>._beforeTokenTransfer(<span class="hljs-keyword">from</span>, to, tokenId);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">_burn</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> tokenId</span>) <span class="hljs-title"><span class="hljs-keyword">internal</span></span> <span class="hljs-title"><span class="hljs-keyword">override</span></span>(<span class="hljs-params">ERC721, ERC721URIStorage</span>) </span>{
        <span class="hljs-built_in">super</span>._burn(tokenId);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">tokenURI</span>(<span class="hljs-params"><span class="hljs-keyword">uint256</span> tokenId</span>)
        <span class="hljs-title"><span class="hljs-keyword">public</span></span>
        <span class="hljs-title"><span class="hljs-keyword">view</span></span>
        <span class="hljs-title"><span class="hljs-keyword">override</span></span>(<span class="hljs-params">ERC721, ERC721URIStorage</span>)
        <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">string</span> <span class="hljs-keyword">memory</span></span>)
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-built_in">super</span>.tokenURI(tokenId);
    }

    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">supportsInterface</span>(<span class="hljs-params"><span class="hljs-keyword">bytes4</span> interfaceId</span>)
        <span class="hljs-title"><span class="hljs-keyword">public</span></span>
        <span class="hljs-title"><span class="hljs-keyword">view</span></span>
        <span class="hljs-title"><span class="hljs-keyword">override</span></span>(<span class="hljs-params">ERC721, ERC721Enumerable</span>)
        <span class="hljs-title"><span class="hljs-keyword">returns</span></span> (<span class="hljs-params"><span class="hljs-keyword">bool</span></span>)
    </span>{
        <span class="hljs-keyword">return</span> <span class="hljs-built_in">super</span>.supportsInterface(interfaceId);
    }
}
</code></pre>]]></content:encoded>
            <author>smelli-mi@newsletter.paragraph.com (Smelli_Mi)</author>
        </item>
    </channel>
</rss>