<?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: Christianaojo</title>
    <description>The latest articles on DEV Community by Christianaojo (@techiechristie).</description>
    <link>https://dev.to/techiechristie</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%2F936948%2F8729fcf0-4bd7-4fb4-bac2-31f10a15c7a8.png</url>
      <title>DEV Community: Christianaojo</title>
      <link>https://dev.to/techiechristie</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/techiechristie"/>
    <language>en</language>
    <item>
      <title>Developing a Competitive Differentiation Strategy to Succeed in the Hyper-Competitive SaaS Market</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Sat, 17 May 2025 18:42:15 +0000</pubDate>
      <link>https://dev.to/techiechristie/developing-a-competitive-differentiation-strategy-to-succeed-in-the-hyper-competitive-saas-market-3pgi</link>
      <guid>https://dev.to/techiechristie/developing-a-competitive-differentiation-strategy-to-succeed-in-the-hyper-competitive-saas-market-3pgi</guid>
      <description>&lt;p&gt;In the fast-paced and highly competitive world of Software as a Service (SaaS), standing out is no longer an option, it’s a survival skill. &lt;/p&gt;

&lt;p&gt;With thousands of SaaS companies jostling for the same customer base, differentiation has become critical for growth. But what does it truly mean to differentiate? And how can you ensure your business isn’t lost in a sea of similar offerings?&lt;/p&gt;

&lt;p&gt;Competitive differentiation is about more than just being different. It’s about offering a unique value that resonates with your target audience, compelling them to choose you over competitors. As &lt;a href="https://www.sethgodin.com/" rel="noopener noreferrer"&gt;Seth Godin&lt;/a&gt; famously said, “Surprise and differentiation have far more impact than noise.” In this crowded marketplace, you aim to rise above the noise by creating a clear, memorable, and valuable position for your business.&lt;/p&gt;

&lt;p&gt;With over 16,000 SaaS companies in the US alone, the competition is fierce. Prospective customers have a plethora of options, each vying for their attention. The question is, how do you set your SaaS business apart? &lt;br&gt;
This guide will walk you through the strategies and techniques used by successful SaaS companies to differentiate themselves and thrive in a saturated market.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Differentiation is Essential for SaaS Success
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://x.com/michaeleporter?lang=en" rel="noopener noreferrer"&gt;Michael E. Porter&lt;/a&gt;, author of What is Strategy, encapsulated the essence of competitive differentiation when he stated, “Competitive strategy is about being different. It means deliberately choosing a different set of activities to deliver a unique mix of value.”&lt;/p&gt;

&lt;p&gt;In the SaaS ecosystem, differentiation goes beyond having a unique product. It’s about demonstrating the value you bring to the table in a way that aligns with your audience's needs and expectations. Without differentiation, your SaaS offering risks being perceived as a commodity, making it harder to attract and retain customers.&lt;/p&gt;

&lt;p&gt;Differentiation not only establishes your identity in the market but it also drives customer loyalty and enhances your brand’s reputation. It’s the foundation upon which lasting customer relationships are built, enabling you to command higher prices, improve customer retention, and achieve sustainable growth. Whether through innovative features, exceptional service, or a compelling brand narrative, standing out is imperative to thrive in today’s hyper-competitive SaaS landscape.&lt;/p&gt;

&lt;h2&gt;
  
  
  Broad vs. Focused Differentiation Strategies
&lt;/h2&gt;

&lt;p&gt;When it comes to differentiation, SaaS businesses generally adopt one of two main approaches: broad differentiation or focused differentiation. Each strategy has its strengths and is suitable for different business models and market dynamics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Broad Differentiation Strategy
&lt;/h3&gt;

&lt;p&gt;Broad differentiation targets a wide customer base by offering features or experiences that appeal to a broad audience. Companies employing this strategy emphasize universal value, ensuring their products resonate across diverse demographics.&lt;/p&gt;

&lt;p&gt;Take &lt;strong&gt;Starbucks&lt;/strong&gt; and &lt;strong&gt;Apple&lt;/strong&gt;, for instance:&lt;/p&gt;

&lt;p&gt;Starbucks transforms a simple coffee purchase into a delightful experience. From the inviting ambiance to the personalized service, Starbucks creates a sense of exclusivity and comfort that encourages customers to pay a premium.&lt;/p&gt;

&lt;p&gt;Apple stands as a symbol of luxury and innovation. By offering sleek, user-friendly products that exude prestige, Apple has cultivated a loyal customer base willing to invest in their ecosystem.&lt;br&gt;
For SaaS companies, implementing a broad differentiation strategy means ensuring that your product’s value is evident and compelling to a wide range of users. Whether through an intuitive user interface, comprehensive features, or exceptional support, the goal is to create a product that appeals universally.&lt;/p&gt;

&lt;h3&gt;
  
  
  Focused Differentiation Strategy
&lt;/h3&gt;

&lt;p&gt;Focused differentiation, on the other hand, hones in on a specific niche or target market. This strategy involves tailoring your product and messaging to meet the unique needs of a well-defined audience.&lt;/p&gt;

&lt;p&gt;A prime example is Lamborghini, which caters exclusively to affluent consumers seeking premium, high-performance vehicles. Their marketing efforts are laser-focused on a narrow segment, ensuring their brand remains synonymous with luxury and exclusivity.&lt;/p&gt;

&lt;p&gt;For SaaS businesses, adopting a focused differentiation strategy can be particularly effective in niche markets. By understanding the unique pain points and goals of a specific audience, you can create a product that feels custom-built, fostering loyalty and driving customer satisfaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Identifying Your Competitive Differentiators
&lt;/h2&gt;

&lt;p&gt;Differentiation starts with understanding what makes your business unique. Your competitive differentiators are the attributes that set you apart from others in the market. These attributes should not only reflect your strengths but also address the needs and preferences of your target audience.&lt;/p&gt;

&lt;p&gt;Here are five key areas where you can differentiate:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Price Differentiators&lt;/strong&gt;&lt;br&gt;
Price can be a powerful differentiator, particularly when paired with flexible billing options or value-driven pricing models. Consider how your pricing strategy aligns with your audience’s expectations and willingness to pay.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Brand Differentiators&lt;/strong&gt;&lt;br&gt;
Your brand’s identity—encompassing its tone, style, and values—plays a pivotal role in how customers perceive you. A strong, consistent brand presence can make your business more memorable and trustworthy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Product Differentiators&lt;/strong&gt;&lt;br&gt;
Unique features, exceptional performance, or innovative design can set your product apart. Highlight the capabilities that provide tangible benefits to your customers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Channel Differentiators&lt;/strong&gt;&lt;br&gt;
The ways in which you deliver your product to customers, including your marketing and distribution channels, can also serve as differentiators. Think about how you can make your offering more accessible or appealing through these channels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Service Differentiators&lt;/strong&gt;&lt;br&gt;
Outstanding customer support and personalized interactions can create lasting impressions. Whether through live chats, social media engagement, or proactive problem-solving, exceptional service fosters loyalty.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Crafting an Effective Differentiation Strategy
&lt;/h2&gt;

&lt;p&gt;Developing a successful differentiation strategy requires a methodical approach. Here’s how you can create one that aligns with your goals and resonates with your audience:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define Your Differentiator
Begin by identifying what sets your product or service apart. Ask yourself: What unique value do we bring to our customers? Is it our pricing model, superior functionality, or exceptional user experience? Once you pinpoint your differentiators, focus on highlighting them in your messaging and branding.&lt;/li&gt;
&lt;li&gt;Develop a Clear Value Proposition
Your value proposition is a concise statement that communicates your product’s unique benefits. It should address the problems your product solves, its advantages over competitors, and the reasons customers should choose your brand. A well-crafted value proposition serves as the foundation for your marketing and sales efforts.&lt;/li&gt;
&lt;li&gt;Embrace Storytelling
Stories are a powerful way to connect with your audience on an emotional level. By weaving narratives that highlight your brand’s mission, values, or customer success stories, you can humanize your business and foster loyalty.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Consider the example of Huggies, which launched the “No Baby Unhugged” campaign to differentiate itself from Pampers. By emphasizing the scientifically proven benefits of hugs for newborns, Huggies created an emotional connection with its audience, leading to increased sales and engagement.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Leverage Customer Feedback
Engage with your customers to understand their needs, preferences, and pain points. Their insights can help you refine your product, improve your services, and identify new opportunities for differentiation.&lt;/li&gt;
&lt;li&gt;Monitor Competitors
Stay informed about your competitors’ strategies and offerings. By understanding their strengths and weaknesses, you can identify gaps in the market and position your business to fill them effectively.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Differentiation in Action: Lessons from Leading SaaS Brands
&lt;/h2&gt;

&lt;p&gt;Successful SaaS companies often employ creative differentiation strategies to stay ahead of the curve. Here are a few examples:&lt;br&gt;
Slack transformed workplace communication by offering an intuitive, user-friendly platform that integrates seamlessly with other tools. Their focus on simplicity and collaboration set them apart in the crowded messaging app market.&lt;br&gt;
HubSpot differentiated itself by providing an all-in-one marketing, sales, and customer service platform tailored to small and medium-sized businesses. Their emphasis on inbound marketing and educational content built a loyal community of users.&lt;br&gt;
Zoom gained prominence by delivering a reliable, easy-to-use video conferencing solution with features that addressed specific pain points, such as meeting security and accessibility.&lt;br&gt;
These brands succeeded by identifying and emphasizing their unique strengths, ensuring their offerings resonated with their target audiences.&lt;/p&gt;

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

&lt;p&gt;In the ever-evolving SaaS market, differentiation is not just a strategy—it’s a necessity. You can stand out in even the most competitive environments by defining your unique value, crafting a compelling narrative, and consistently delivering exceptional experiences.&lt;/p&gt;

&lt;p&gt;Remember, differentiation is an ongoing process. As customer needs evolve and market dynamics shift, stay proactive in refining your strategy to maintain your competitive edge. By doing so, you’ll position your SaaS business for sustainable growth and long-term success. It’s time to rise above the noise and make your mark.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Exploring Ethereum's New ERC-4337 Standard: A Revolutionary, User-Friendly Innovation for Blockchain Applications</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Tue, 16 May 2023 08:51:54 +0000</pubDate>
      <link>https://dev.to/techiechristie/exploring-ethereums-new-erc-4337-standard-a-revolutionary-user-friendly-innovation-for-blockchain-applications-14nd</link>
      <guid>https://dev.to/techiechristie/exploring-ethereums-new-erc-4337-standard-a-revolutionary-user-friendly-innovation-for-blockchain-applications-14nd</guid>
      <description>&lt;h2&gt;
  
  
  Introduction of Ethereum and Ethereum standards.
&lt;/h2&gt;

&lt;p&gt;One of the most popular and widely applied blockchain technologies is &lt;a href="https://ethereum.org/en/"&gt;Ethereum&lt;/a&gt;. While Ethereum's native coin, ether (ETH), litecoin (LTC) as well as bitcoin cash (BCH), can be used to make payments, Ethereum was built to be a much more adaptable and feature-rich blockchain system. Decentralized applications (dApps) and smart contracts can both be run on Ethereum. Additionally, it permits the augmentation of its fundamental protocol with tokens.&lt;/p&gt;

&lt;p&gt;On the Ethereum blockchain, the creation and management of tokens is governed by a number of token standards. The adoption of Ethereum in the decentralized finance (DeFi) ecosystem has been greatly aided by these token standards, which also include &lt;a href="https://ethereum.org/en/developers/docs/standards/tokens/erc-20/"&gt;ERC-20&lt;/a&gt;, &lt;a href="https://eips.ethereum.org/EIPS/eip-721"&gt;ERC-721&lt;/a&gt;, &lt;a href="https://ethereum.org/en/developers/docs/standards/tokens/erc-1155/"&gt;ERC-1155&lt;/a&gt;, and many others.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new ERC-4337
&lt;/h2&gt;

&lt;p&gt;A new Smart wallet standard called &lt;a href="https://eips.ethereum.org/EIPS/eip-4337"&gt;ERC-4337&lt;/a&gt; was released on the Ethereum mainnet in March 2023 with the goal of enhancing user experience inside the blockchain ecosystem. It is intended to improve the compatibility and interoperability of various tokens on the Ethereum network, simplifying the creation and management of tokens on the blockchain for developers. It is a framework around submission of transactions on Ethereum without making direct changes to consensus. The capacity of ERC-4337 to let token holders to carry out specific operations without the need for third-party intermediaries is one of its primary advantages. This makes it simpler to develop new use cases and applications since it allows for greater autonomy and flexibility in managing tokens. Ethereum has significantly improved the usefulness and accessibility of blockchain technology for both users and developers with the launch of ERC-4337.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features of ERC-4337 and availability
&lt;/h2&gt;

&lt;p&gt;ERC-4337 is a game-changing breakthrough for the Ethereum blockchain ecosystem thanks to a number of its features. Account abstraction, one of its core characteristics, dramatically enhances user friendliness and makes it simpler for developers to generate and administer tokens on the blockchain. Additionally, it has sophisticated capabilities including batch transfers, transaction tracking, and cryptographic signatures for authenticating transactions. In addition, ERC-4337 allows for the production of non-fungible tokens (NFTs), which have grown incredibly popular in recent years due to their application in video games, collectibles, and digital art. Regarding accessibility, ERC-4337 is an open-source standard that anybody can use and expand on, making sure that it is still available to the larger blockchain community. &lt;/p&gt;

&lt;p&gt;ERC-4337 is also available on networks compatible with the Ethereum Virtual Machine (EVM) such as Polygon, Avalanche, Arbitrum, and several others.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benefits of ERC-4337
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ERC-4337 allows for the use of smart accounts that are expected to be more user friendly for beginners
&lt;/h3&gt;

&lt;p&gt;ERC-4337 allows for the use of smart accounts, which are expected to be more user-friendly for beginners due to their simplified management and increased flexibility. With smart accounts, users can set up predefined rules and conditions for token transfers, such as setting transaction limits, requiring multiple authorizations, or locking tokens for a specific time period. This reduces the complexity of managing tokens, making it easier for beginners to navigate the blockchain ecosystem. Additionally, smart accounts provide greater security and transparency by enabling users to track and verify their transactions using cryptographic signatures. This ensures that transactions are secure and tamper-proof, protecting users from potential fraud and theft. &lt;/p&gt;

&lt;h3&gt;
  
  
  It saves Time and reduce transaction fees
&lt;/h3&gt;

&lt;p&gt;ERC-4337 enables dApp developers to cover all or part of the cost of users' transaction fees, which are frequently charged to users on dApps. Additionally, ERC-4337 enables users to pay fees using ERC-20 tokens rather than ETH. As a result, a decentralized fee market for smart contract operations should be created. Additionally, it supports the usage of aggregated signatures and enables several privacy-preserving features. Additionally, ERC-4337 is accessible on networks like Polygon, Avalanche, Arbitrum, and a number of others that support the Ethereum Virtual Machine (EVM).&lt;br&gt;
ERC-4337 allows you to send several transactions when submitting transactions, which ultimately help you save time and money on transaction fees. &lt;/p&gt;

&lt;h3&gt;
  
  
  Account abstraction
&lt;/h3&gt;

&lt;p&gt;By adopting account abstractiion, the ERC-4337, is aimed to increase adoption and improve interactivity. One of the major blocks of blockchain adoption is security- the fact that users would have to memorize security keys or save them off chain, and user may completely loose access to the wallet if they could not access or remember the secret keys. With Account abstraction, private keys for a crypto wallet can be stored on a smartphone's default security module. This would create what some would consider a hardware wallet within their phone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Enhanced interoperability and compatibility
&lt;/h3&gt;

&lt;p&gt;The compatibility and interoperability of tokens on the Ethereum blockchain network have been considerably improved by ERC-4337. This is accomplished by standardizing token transfers, which makes it simpler to transfer tokens between various wallets and decentralized applications (DApps) on the network. Because of this improved interoperability, tokens can now be utilized in a larger variety of applications, enhancing the Ethereum ecosystem's overall usefulness. Additionally, ERC-4337's interoperability with other Ethereum token standards makes it simple for developers to incorporate pre-existing tokens to fresh DApps or design new tokens that work with already-existing programs. The Ethereum community benefits from more collaboration and creativity as a result of the huge reduction in development time and expense.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implication of ERC-4337 for Ethereum Adoption
&lt;/h2&gt;

&lt;p&gt;The ERC-4337 standard has significant implications for the adoption of Ethereum as a blockchain platform. By improving the user experience and increasing the flexibility of managing tokens, it makes Ethereum more accessible and user-friendly to a wider audience. This, in turn, is likely to increase adoption by developers and users, driving the growth of decentralized applications and the Ethereum ecosystem as a whole. The enhanced interoperability and compatibility of tokens under ERC-4337 also allows for greater innovation and collaboration among developers, leading to the creation of new use cases and applications for the platform. Furthermore, the availability of ERC-4337 as an open-source standard ensures that it remains accessible and relevant to the wider blockchain community, further promoting the adoption and growth of Ethereum. &lt;/p&gt;

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

&lt;p&gt;ERC-4337 lays the technical foundation for innovative cryptocurrency wallets. Based on what they can create, developers may alter the primary interface between users and cryptocurrencies. Nevertheless, in the years to come, it will be important to monitor how ERC-4337 affects user experience and cryptocurrency in general. &lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://eips.ethereum.org/EIPS/eip-4337"&gt;EIPS.ethereum.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>web3</category>
      <category>blockchain</category>
      <category>ethereum</category>
      <category>erc</category>
    </item>
    <item>
      <title>Build with Boba: The Future of Blockchain Development with Boba Network.</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Fri, 12 May 2023 10:04:45 +0000</pubDate>
      <link>https://dev.to/techiechristie/build-with-boba-the-future-of-blockchain-development-with-boba-network-3g2f</link>
      <guid>https://dev.to/techiechristie/build-with-boba-the-future-of-blockchain-development-with-boba-network-3g2f</guid>
      <description>&lt;p&gt;Blockchain technology is undoubtedly the technology of the future. At its core, blockchain is a decentralized and distributed ledger system that enables secure and transparent transactions and data management, and &lt;a href="https://boba.network/"&gt;Boba Network&lt;/a&gt; is at the forefront of the industry with its innovative take on this technology. With a unique approach, the Boba network aims to deliver a faster, cheaper, and smarter experience for blockchain's next billion users. &lt;/p&gt;

&lt;p&gt;Boba provides a scalable, secure, and decentralized platform that is perfect for businesses and individuals alike. When it comes to blockchain technology, Boba is truly raising the bar as it is setting the standard for what the blockchain of the future will look like with its cutting-edge technologies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Boba Network and Its Unique Features
&lt;/h2&gt;

&lt;p&gt;From the foundational aim of scaling Ethereum, Boba Network has grown into a multi-chain scaling solution built on top of the blockchain industry's biggest protocol known as &lt;a href="https://ethereum.org/en/layer-2/"&gt;layer-2(L2)&lt;/a&gt;, that now aims to become a universal scaling platform for all blockchains by providing a faster, cheaper, more dynamic and secure Web3 experience while ultimately increasing blockchain usability.&lt;/p&gt;

&lt;p&gt;Using one of the most popular blockchain scaling solutions to date - &lt;a href="https://ethereum.org/en/layer-2/"&gt;Optimistic Rollups (ORs)&lt;/a&gt;, Boba Network is working to significantly reduce transaction fees, increase throughput and expand the capacities of smart contracts on multiple(&lt;a href="https://ethereum.org/en/developers/docs/evm/"&gt;EVM&lt;/a&gt;) based protocols.&lt;/p&gt;

&lt;p&gt;As the first scaling infrastructure deployed on multiple blockchains including Ethereum, Avalanche, Binance Chain, and more, it has full EVM compatibility which makes execution of any smart contract currently running on Ethereum or any EVM-compatible blockchain super easy without losing the underlying security.&lt;/p&gt;

&lt;p&gt;For gaming users, Boba has a specialized gaming interface that enables players to seamlessly engage with their preferred games, exercise complete authority over their in-game possessions, and accumulate loyalty points.&lt;/p&gt;

&lt;p&gt;The team behind Boba Network is working diligently to establish it as the preferred platform for both smart contract developers and individual users, even though it is still in its early growth stages, the response thus far has been overwhelmingly favorable, and we eagerly anticipate what the future holds for the network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recent Development and what it means for Developers
&lt;/h2&gt;

&lt;p&gt;In April 2023, the team recently announced that its BobaBNB platform processed a record-breaking &lt;a href="https://blockexplorer.bnb.boba.network/"&gt;2,863,240 transactions&lt;/a&gt;. This marked a significant surge compared to 585,818 transactions in March and 99,362 transactions in February. &lt;/p&gt;

&lt;p&gt;The network boasts over &lt;a href="https://twitter.com/bobanetwork/status/1653173875117551617?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1653173875117551617%7Ctwgr%5E2028138bd51ded50735f82808a3f00d2a3d15ac6%7Ctwcon%5Es1_&amp;amp;ref_url=https%3A%2F%2Fu.today%2Fbobabnb-network-surpassed-45000-wallets-in-april-with-28-million-transactions-processed"&gt;45,000 registered wallets&lt;/a&gt; and handles more than 100,000 transactions daily. These figures demonstrate a remarkable increase in adoption and activity on the network.&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NBU7rd2W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ayx2w778a6h9bg6yarp.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NBU7rd2W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0ayx2w778a6h9bg6yarp.JPG" alt="Image description" width="572" height="381"&gt;&lt;/a&gt;&lt;br&gt;
On the Boba network, users and developers can save an average of 80% on transaction fees while enjoying extremely fast transaction speeds. This achievement is a major milestone, representing the first instance of substantial L2 transaction volume on a non-Ethereum environment. It is expected to revolutionize transactions and attract more users to the network.&lt;/p&gt;

&lt;p&gt;Also in April, the team announced a partnership with &lt;a href="https://www.rovi.network/"&gt;ROVI Network&lt;/a&gt;, this enables users to use Non-Custodial MPC Wallet, 1-click On/Off Ramp Infra, piggybacked upon already existing behavior of masses on WhatsApp Messaging, Payments and Gaming.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“We are glad to see the growing adoption of BobaBNB with these remarkable transaction volumes. As an advanced layer-2 scaling solution on BNB Chain, Boba Network aims to accelerate the development of dApps and games, and we are excited to see what the future holds for this ecosystem”,&lt;/em&gt; ---Zoe Wei, Head of Marketing and DevRel at BNB Chain.&lt;/p&gt;

&lt;p&gt;Previously, in November 2022, Boba Network became BNB Chain’s First Layer-2 Scaling Solution by deploying the first layer-two to BNB Chain, offering enhanced scalability and low fee computation to a top-3 popular blockchain by total value locked.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for developers
&lt;/h2&gt;

&lt;p&gt;For developers, in addition to incredible speeds and significantly lower fees, Boba offers a swap-based system for rapid L2-&amp;gt;L1 exits. It enables normal interaction with L2 ETH by using familiar Ethereum methods such as &lt;code&gt;msg.value&lt;/code&gt;, &lt;code&gt;eth_sendTransaction&lt;/code&gt;, and &lt;code&gt;provider.getBalance(address)&lt;/code&gt; instead of requiring WETH. The process of deploying smart contracts on the network is also smooth and fast. In fact, for most contracts, the deployment experience is exactly like deploying on Ethereum.&lt;/p&gt;

&lt;p&gt;The official development stacks provided by Boba are simple and can be learned about &lt;a href="https://docs.boba.network/for-developers/local-stack"&gt;here&lt;/a&gt;. You can also contribute to the project on the &lt;a href="https://goerli.boba.network/"&gt;official repository&lt;/a&gt;.&lt;br&gt;
Boba is a relatively new blockchain designed to be scalable and fast. It is already being used by several projects and has secured partnerships with other significant players in the industry.&lt;br&gt;
All indications suggest that the Boba blockchain network is trending upward. Furthermore, its rapid short and long-term growth is acceptance points to a promising future. This is fantastic news for the entire blockchain ecosystem, demonstrating how blockchain technology is evolving and the wide range of adoptions and applications it can support.&lt;/p&gt;

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

&lt;p&gt;As the blockchain industry continues to evolve, Boba Network's commitment to innovation, scalability, sustainability, and security positions it as a front-runner in the future of blockchain development. By embracing Boba Network and harnessing its capabilities, smart contract developers and businesses can unlock the full potential of blockchain technology, revolutionize industries, and create new possibilities for economic and social transformation. &lt;/p&gt;

&lt;p&gt;The future of Boba Network is promising and bright, with ongoing advancements and innovations that will further solidify its position as a leading blockchain platform. Through its commitment to scalability, interoperability, sustainability, and governance, Boba Network will continue to attract developers, foster collaboration, and drive the next wave of decentralized applications that transform industries and shape the future of blockchain technology.&lt;/p&gt;

</description>
      <category>blockchain</category>
      <category>developer</category>
      <category>web3</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Frontend Development Essentials for 2023.</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Fri, 24 Mar 2023 11:31:19 +0000</pubDate>
      <link>https://dev.to/techiechristie/frontend-development-essentials-for-2023-4177</link>
      <guid>https://dev.to/techiechristie/frontend-development-essentials-for-2023-4177</guid>
      <description>&lt;p&gt;Frontend development is an ever-changing field, and staying up-to-date with the latest trends and technologies is crucial for success. As we head into 2023, there are some essential frontend tools and technologies that every developer should be familiar with. In this article, we'll explore some of the most important frontend essentials for 2023.&lt;/p&gt;

&lt;h2&gt;
  
  
  React
&lt;/h2&gt;

&lt;p&gt;React has been a dominant force in frontend development for years, and it's not going anywhere anytime soon. With its efficient rendering and reusable components, React is a great choice for building complex user interfaces. In 2023, React is still a must-know for frontend developers, and staying up-to-date with its latest features and best practices is essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  TypeScript
&lt;/h2&gt;

&lt;p&gt;TypeScript is a typed superset of JavaScript that helps catch errors before they become runtime issues. It provides better tooling, more reliable code, and improved scalability for large codebases. In 2023, TypeScript is becoming more and more popular, and many companies are adopting it as their primary language for frontend development.&lt;/p&gt;

&lt;h2&gt;
  
  
  CSS Grid
&lt;/h2&gt;

&lt;p&gt;CSS Grid is a powerful layout tool that allows you to create complex layouts with ease. With its ability to handle both rows and columns, CSS Grid can help you create responsive and flexible designs that work on any device. In 2023, CSS Grid is a must-know for any frontend developer looking to create modern, dynamic layouts.&lt;/p&gt;

&lt;h2&gt;
  
  
  GraphQL
&lt;/h2&gt;

&lt;p&gt;GraphQL is a query language for APIs that allows you to request only the data you need, making it more efficient than traditional REST APIs. With its ability to reduce network requests and improve performance, GraphQL is becoming increasingly popular in frontend development. In 2023, it's essential for developers to understand how to use GraphQL to optimize their web applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next.js
&lt;/h2&gt;

&lt;p&gt;Next.js is a React framework that allows you to build server-side rendered and statically generated websites with ease. With its simple setup and built-in optimizations, Next.js is a great choice for building fast and SEO-friendly web applications. In 2023, Next.js is becoming more popular, and it's essential for frontend developers to know how to use it to build modern web applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tailwind CSS
&lt;/h2&gt;

&lt;p&gt;Tailwind CSS is a utility-first CSS framework that allows you to build responsive designs with minimal effort. With its extensive set of pre-defined classes, Tailwind CSS can help you speed up your development process and create consistent, high-quality designs. In 2023, Tailwind CSS is gaining popularity, and it's becoming an essential tool for frontend developers.&lt;/p&gt;

&lt;h2&gt;
  
  
  WebAssembly
&lt;/h2&gt;

&lt;p&gt;WebAssembly is a binary format that allows you to run code written in languages other than JavaScript, such as C, C++, and Rust, in the browser. With its ability to improve performance and reduce the size of web applications, WebAssembly is becoming more and more popular in frontend development. In 2023, it's essential for developers to understand how to use WebAssembly to optimize their web applications.&lt;/p&gt;

&lt;p&gt;In conclusion, frontend development is an exciting and ever-changing field, and staying up-to-date with the latest tools and technologies is crucial for success. In 2023, the above tools and technologies are becoming essential for frontend developers. By mastering these essentials, developers can build modern, high-quality web applications that meet the needs of today's users&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Utilizing the Benefits of Smart Contract Security Auditing</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Thu, 09 Feb 2023 16:16:05 +0000</pubDate>
      <link>https://dev.to/techiechristie/utilizing-the-benefits-of-smart-contract-security-auditing-23dk</link>
      <guid>https://dev.to/techiechristie/utilizing-the-benefits-of-smart-contract-security-auditing-23dk</guid>
      <description>&lt;p&gt;There's a famous saying that with a smart contract, the code is the law. Meaning there is no room for error. The contract can run only as the coding dictates. And once smart contracts have been deployed, developers can't fix them. They must create a new version and deploy that, which can be costly and time-consuming. Smart contract security auditors can help ensure that coding is safe and secure.&lt;/p&gt;

&lt;p&gt;This article will take us through a detailed analysis of a smart contract security audit, including its importance and benefits, working mechanisms, types, costs, and much more.&lt;/p&gt;

&lt;h2&gt;
  
  
  What are Smart Contracts?
&lt;/h2&gt;

&lt;p&gt;Before finding out how to audit a smart contract, let's have a brief understanding of smart contracts. Smart contracts are computerized transaction protocols tailored for executing the terms of a contract. Primarily, smart contracts are tailored to address common contractual conditions while reducing accidental exceptions and the involvement of intermediaries.&lt;/p&gt;

&lt;p&gt;Presently, smart contracts serve a wide range of use cases, such as supply chain management, ICOs, and electoral voting. So, where is the problem? Just like any other software, smart contracts come with security vulnerabilities. Therefore, a smart contract audit is necessary to ensure that smart contracts are free of security issues. At the same time, auditing also ensures that smart contracts are optimized to provide ideal performance levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a Smart Contract Security Audit?
&lt;/h2&gt;

&lt;p&gt;A smart contract security audit involves a detailed analysis of the contract's code to identify security issues and incorrect and inefficient coding and to determine ways to resolve the problems. The audit process is essential to ensuring blockchain applications' security and reliability. A smart contract audit analyzes the source code to see if it follows the predetermined conditions and behaves as the developer intends. Auditing a smart contract aims to discover possible errors and security vulnerabilities in the code and recommend improvements and ways to fix them.&lt;/p&gt;

&lt;p&gt;Smart contract security audits are widespread in the Decentralized Finance (DeFi) space. At the same time, most people understand the importance of audits for cybersecurity, but only some care to dive into the lines of code. However, considering investing in a project, it is better to consider its smart contract code review and decision.&lt;/p&gt;

&lt;p&gt;Therefore, smart contract security auditing involves bringing in many potential scenarios and running endless, exhaustive tests with many third-party applications to find any bugs. After the initial testing, the auditors produces a report for the contract-building team to review. The team can address any problems before the audit is over. This offers them the opportunity to add any revisions to the final report.&lt;/p&gt;

&lt;h2&gt;
  
  
  Types of Smart Contracts Security Audits
&lt;/h2&gt;

&lt;p&gt;An audit can be categorized in two ways: External and Internal Audit&lt;/p&gt;

&lt;p&gt;External auditing signifies outsourcing smart contract auditing to a third-party unrelated to the project development. External auditing adds a different dimensionality to your smart contract. The external audit team consists of a specialized team of security professionals providing an unbiased perspective on your project. Also, hiring an outsider is typically cost-effective rather than maintaining a team of security professionals.&lt;/p&gt;

&lt;p&gt;Internal auditing implies an internal team of security professionals to test projects for vulnerabilities. Undoubtedly, this could be the first line of assessment for your project. Also, unlike an external audit, there is no need to pre-plan an audit which can be done periodically. However, it can be costly to maintain a whole team of security experts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why are Smart Contract Security Audits Important?
&lt;/h2&gt;

&lt;p&gt;After finding the answer to ‘what is a smart contract security audit?’ it is reasonable to look for its significance. Security is one of the formidable concerns for smart contract implementation in present times. The concerns of inefficiency, security issues, and misbehavior could lead to excessively high additional costs in implementing smart contracts on a blockchain network.&lt;/p&gt;

&lt;p&gt;While blockchain technology is secure, blockchain applications have security vulnerabilities. One of the best-known security incidents involving smart contracts was a theft worth $50 million in 2016. Hackers exploited vulnerable code in a blockchain investment fund, the DAO, controlled through smart contracts. A smart contract security audit team can help mitigate such risks.&lt;/p&gt;

&lt;p&gt;Blockchain enterprises are often troubled concerning smart contract implementation. Considering its irreversible nature, an attack once made can’t be rolled back—furthermore, risk of losing the entire contract and its assets due to security vulnerabilities in smart contracts.&lt;/p&gt;

&lt;p&gt;Below are a few benefits of a smart contract security audit:&lt;/p&gt;

&lt;p&gt;A security audit identifies major systemic flaws in your project and avoids costly errors. Auditing code early in the development lifecycle can prevent fatal flaws after launch.&lt;/p&gt;

&lt;p&gt;Establishing trust with your investors and users is critical. An audit acts as a security stamp, adding a layer of security to your project.&lt;/p&gt;

&lt;p&gt;Security audits are critical for developing risk assessment plans and mitigation strategies for organizations dealing with individuals’ sensitive and confidential data.&lt;/p&gt;

&lt;p&gt;An audit will erect a hack-proof wall around your project, shielding it from potential threats.&lt;/p&gt;

&lt;p&gt;Auditing not only detects code errors but also optimizes them for performance.&lt;/p&gt;

&lt;p&gt;Process for Smart Contract Security Audit&lt;br&gt;
A smart contract audit is a comprehensive process. A smart contract can consist of thousands or tens of thousands of lines of coding. Even obvious issues sometimes get lost in the sheer bulk. The testing tools and human auditors must discover errors and potential vulnerabilities in the coding as written and in what is missing. Let's break down the process of a smart contract security audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation
&lt;/h2&gt;

&lt;p&gt;The first step of an audit is to gather all relevant documentation. This includes the white paper, codebase, and any other material related to the smart contract. The auditor can gain a high-level understanding of the blockchain application by reading the design documentation.&lt;/p&gt;

&lt;p&gt;Without access to documentation, the auditors will have no way of knowing what the smart contract is designed to do. Documentation, including a full specification for the project, is essential to the auditing process. For auditors to see the code working as intended, they must know what you want the code to achieve.&lt;/p&gt;

&lt;p&gt;The developers and auditors must agree on a code freeze at this stage. No more code will be written, or the contract audit will not consider any code written after that point.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unit Testing
&lt;/h2&gt;

&lt;p&gt;Once the auditor understands the code and the application, they will run automated tests with various tools. At this stage, smart contract auditors use auditing tools and testnet, ensuring unit testing covers the maximum risk involved. This is by far the easiest way to detect potential issues. The auditors will take various steps, including integration tests exploring large amounts of code, unit tests looking at individual functions, and penetration testing to probe for security vulnerabilities.&lt;/p&gt;

&lt;p&gt;Line coverage is an excellent measure of how well the tests cover the code. High line coverage indicates that the tests are doing an excellent job of exploring all of the lines of code in the application. Once the automated tests are complete, the auditor will move on to manual testing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual Auditing
&lt;/h2&gt;

&lt;p&gt;Even though automated tests can identify possible vulnerabilities in the code, they cannot understand what a blockchain developer is trying to achieve with their application. They can also turn up false negatives. This shows why a manual review of the code is essential. By reading the code and understanding how everything fits together, auditors identify potential issues that automated tests miss.&lt;/p&gt;

&lt;p&gt;When an audit team analyzes the code, they can refer back to the project specification and any other supporting documentation to see whether the code performs as it should. A mixture of manual and automated testing is vital to ensuring nothing slips through the cracks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Initial Reporting
&lt;/h2&gt;

&lt;p&gt;Following manual and automated audits, an initial report highlighting the issues and their severity levels is compiled. Furthermore, the security team explained issues with the smart contract and its severity levels.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Refactoring
&lt;/h2&gt;

&lt;p&gt;Once the auditor has found issues in the code, they will work with the project team to resolve them. This process can be long and complicated, but it is essential to the project's success. By resolving all issues, you can ensure that your smart contracts are ready for deployment.&lt;/p&gt;

&lt;p&gt;When it comes to blockchain applications, security is of utmost importance. That's why it's essential to have a team of experienced auditors who helps identify and mitigate potential issues with your code. Before beginning the deployment process, ensure you have enough time for a complete security audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Audit report
&lt;/h2&gt;

&lt;p&gt;Once the audit is complete, the auditor will provide a report detailing their findings. This report will be a valuable resource for the project team and anyone involved in the application. It will help to identify any potential issues that may have been missed and provide a roadmap for resolving them.&lt;/p&gt;

&lt;h2&gt;
  
  
  How much does a smart contract audit cost?
&lt;/h2&gt;

&lt;p&gt;The cost of a smart contract audit varies depending on the size and complexity of the application. In general, smart contract auditors typically charge USD 5,000 to USD 15,000 but might charge more depending on the size and complexity of the contract.&lt;/p&gt;

&lt;p&gt;If you are considering using a blockchain application, smart contract auditing by an experienced auditing team is a no-brainer. Smart contracts execute financial transactions and are relied upon for essential functions. Unlike with other types of software, bug-free code is vital here.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Become a Smart Contract Auditor?
&lt;/h2&gt;

&lt;p&gt;A smart contract auditor is a security professional who manually examines the smart contract line by line and uses smart contract audit tools to check for bugs.&lt;/p&gt;

&lt;p&gt;An auditor verifies that a contract is securely and correctly implemented on a blockchain network.&lt;/p&gt;

&lt;p&gt;Demand for auditors has increased with the rising popularity of smart contracts and the growing crypto-heists associated with them. Although there could be several ways to become a smart contract auditor, here is a step-by-step that you can follow.&lt;/p&gt;

&lt;p&gt;Learn programming - any language, whether Java, C++, or python, would work. The aim is for you to understand the fundamentals of coding.&lt;/p&gt;

&lt;p&gt;Once you understand coding, move to Ethereum basics and token standards, including ERC20, ERC721, ERC777, ERC1155, ERC4626, and BEP20.&lt;/p&gt;

&lt;p&gt;Learn Solidity - is an EVM-compatible programming language used for most smart contracts. And due to its widespread popularity, it has much documentation and study material compared to non-EVM-compatible languages.&lt;/p&gt;

&lt;p&gt;Smart contract audit is not only about detecting bugs. It is responsible for optimized code functioning as well. Therefore, it is essential to read about gas optimization, upgradable and proxy contracts, smart contract helper libraries, blockchain protocols, and smart contract debugging.&lt;/p&gt;

&lt;p&gt;Develop a clear understanding of decentralized finance(DeFi), the hottest area for auditing. Defi hacks are one of the most popular and recurring phenomena in the blockchain. Hence, you must have detailed knowledge about DeFi smart contract functioning and its vulnerabilities.&lt;/p&gt;

&lt;p&gt;Try hands-on smart contract audit tools for a thorough review of the code.&lt;/p&gt;

&lt;p&gt;Reporting is an integral part of an audit. Learn to report reading so that you can even develop one without errors.&lt;/p&gt;

&lt;p&gt;To stay informed about blockchain security, follow and read the blog posts of top security researchers such as Samczun, Peck-shield, Mudit Gupta, and others.&lt;/p&gt;

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

&lt;p&gt;A security audit is so essential it might as well be considered a part of smart contract development. It is quite clear that smart contract audits could be a promising tool for improving the functionality of smart contracts. What seemed almost impenetrable had some security vulnerabilities in them. The smart contract audit cost might vary considerably depending on the platform or tool you select to use.&lt;/p&gt;

&lt;p&gt;Many other factors also affect the efficiency of smart contract audits, such as communication between the project team and the audit team. However, enterprises should work on identifying the challenges of smart contract audits to improve their effectiveness in leveraging smart contracts.&lt;/p&gt;

&lt;p&gt;If you intend to become a professional smart contract auditor, you can check out &lt;a href="https://www.ekolance.io/" rel="noopener noreferrer"&gt;ekolance&lt;/a&gt;. They help professionals start working on Blockchain, and they're also running ten weeks of free Smart Contract Audit Training&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>mongodb</category>
      <category>database</category>
      <category>performance</category>
    </item>
    <item>
      <title>Build Refactor: A React app with the new Firebase v9.x Web SDK</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Mon, 28 Nov 2022 10:18:41 +0000</pubDate>
      <link>https://dev.to/techiechristie/build-refactor-a-react-app-with-the-new-firebase-v9x-web-sdk-2520</link>
      <guid>https://dev.to/techiechristie/build-refactor-a-react-app-with-the-new-firebase-v9x-web-sdk-2520</guid>
      <description>&lt;p&gt;The release of version 9 of the &lt;a href="https://github.com/firebase/firebase-js-sdk" rel="noopener noreferrer"&gt;Firebase Web SDK&lt;/a&gt; has introduced breaking changes in methods for managing users and querying databases. Code written in Firebase v8.x will throw errors when used in v9.x, which calls for refactoring.&lt;/p&gt;

&lt;p&gt;In this article, we’ll learn how to refactor a React app that uses the Firebase Web SDK v8.x to v9.x., which is also called the &lt;a href="https://firebase.google.com/docs/web/modular-upgrade" rel="noopener noreferrer"&gt;modular Web SDK&lt;/a&gt;. For our example, we’ll use an Amazon clone built with v8.x and refactor it to v9.x. Let’s get started!&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To follow along with this tutorial, you should be familiar with React and Firebase v8.x. You should also have Node.js installed on your machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing Firebase v9.x Web SDK
&lt;/h2&gt;

&lt;p&gt;The new web SDK moves away from the namespace approach that was used in version 8. Instead, it adopts a modular format optimized for eliminating unused code, for example, tree shaking, resulting in a significant reduction in the JavaScript bundle size.&lt;/p&gt;

&lt;p&gt;The transition to a modular approach has introduced breaking changes, making the new library backward incompatible and causing the code used in v8.x to throw errors in the new Firebase v9.x SDK.&lt;/p&gt;

&lt;p&gt;The following code shows some of the breaking changes introduced in the new library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// VERSION 8
import firebase from 'firebase/app';
import 'firebase/auth'; 

firebase.initializeApp();
const auth = firebase.auth();

auth.onAuthStateChanged(user =&amp;gt; { 
  // Check for user status
});


// VERSION 9 EQUIVALENT
import { initializeApp } from 'firebase/app';
import { getAuth, onAuthStateChanged } from 'firebase/auth';

const firebaseApp = initializeApp();
const auth = getAuth(firebaseApp);

onAuthStateChanged(auth, user =&amp;gt; {
  // Check for user status
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Both code samples above monitor a user state. Although both are similar in the number of lines of code used, in v9.x, instead of importing the &lt;code&gt;firebase&lt;/code&gt; namespace or the &lt;code&gt;firebase/auth&lt;/code&gt; side effect, which augments authentication service to the &lt;code&gt;firebase&lt;/code&gt; namespace, we are importing and using individual functions.&lt;/p&gt;

&lt;p&gt;These changes take advantage of the code elimination features of modern JavaScript tools like &lt;a href="https://blog.logrocket.com/benchmarking-bundlers-2020-rollup-parcel-webpack/" rel="noopener noreferrer"&gt;Webpack and Rollup&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;For example, the v8.x code above includes the following code snippet:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;auth.onAuthStateChanged(user =&amp;gt; { 
  // Check for user status
});

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

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;auth&lt;/code&gt; is a namespace and a service that contains the &lt;code&gt;onAuthStateChanged&lt;/code&gt; method. The namespace also contains methods like &lt;code&gt;signInWithEmailAndPassword&lt;/code&gt;, &lt;code&gt;createUserWithEmailAndPassword&lt;/code&gt;, and &lt;code&gt;signOut&lt;/code&gt;, which are not being used by the code. When we bundle our entire code, these unused methods will also be included in the bundle, resulting in a relative size increase.&lt;/p&gt;

&lt;p&gt;Though bundlers like Webpack and Rollup can be used to eliminate unused code, due to the namespace approach, they will have no effect. Solving this issue is one of the primary goals of remodeling the API surface to take a modular shape. To learn more about the reasons behind the changes in the new library, check out the &lt;a href="https://firebase.googleblog.com/2021/08/deep-dive-into-the-new-firebase-js-sdk-design.html" rel="noopener noreferrer"&gt;official Firebase blog&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Firebase compatibility library
&lt;/h2&gt;

&lt;p&gt;The new SDK also includes a compatibility library with a familiar API surface, which is fully compatible with v8.x. The compatibility library allows us to use both old and new APIs in the same codebase, enabling us to progressively refactor our app without breaking it. We can use the compatibility library by making a few tweaks to the import paths as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import firebase from 'firebase/compat/app';
import 'firebase/compat/auth';
import 'firebase/compat/firestore';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll take advantage of the library when we refactor our Amazon clone app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Firebase Web SDK v9.x benefits
&lt;/h2&gt;

&lt;p&gt;In short, the Firebase Web SDK v9.x offers reduced size and increased performance overall. By taking advantage of code elimination features through JavaScript tools like Webpack and Rollup, the new web SDK offers a faster web experience. With the new modular shape, the new SDK is said to be about 80 percent smaller than its predecessors, according to the official &lt;a href="https://twitter.com/Firebase?ref_src=twsrc%5Egoogle%7Ctwcamp%5Eserp%7Ctwgr%5Eauthor" rel="noopener noreferrer"&gt;Firebase Twitter&lt;/a&gt; account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Firebase Tweet v9 80 Percent Size
&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%2Fuo59wfqd0stmqp093y1k.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%2Fuo59wfqd0stmqp093y1k.png" alt="Image description" width="730" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up our React app for refactoring
&lt;/h2&gt;

&lt;p&gt;Now that we’re familiar with the new SDK, let’s learn how to refactor our v8.x app. The Amazon clone app that we’ll use in this section is an ecommerce app built using Firebase and Strapi.&lt;/p&gt;

&lt;p&gt;In our app, we used Firebase to add features like managing user identity with Firebase authentication and storing products purchased by authenticated users with Cloud Firestore. We used Strapi to handle payments for products bought on the app. Finally, we created an API with Express.js that responds with the Strapi client secret of a customer who is about to purchase a product with Firebase Cloud Functions.&lt;/p&gt;

&lt;p&gt;You can access a &lt;a href="https://challange-5f99e.web.app/" rel="noopener noreferrer"&gt;deployed version of the site&lt;/a&gt;, which looks like the image below:&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%2F858uvc5vcnzwa8gi1xje.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%2F858uvc5vcnzwa8gi1xje.png" alt="Image description" width="730" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Amazon Clone App
&lt;/h2&gt;

&lt;p&gt;Feel free to play around with the app to better understand what we’re working on in this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting up the Amazon clone app
&lt;/h2&gt;

&lt;p&gt;Before we begin coding, first, let’s clone the repo from GitHub and install the necessary npm packages. Open your terminal and navigate to the folder you would like to store the React app in. Add the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ git clone https://github.com/Tammibriggs/Amazon-clone-FirebaseV8.git
$ cd Amazon-clone-FirebaseV8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we’ve successfully cloned the repo, we need to change the Firebase version in the &lt;code&gt;package.json&lt;/code&gt; file to v9.x before we install the packages.&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%2F64fw5ubsua8ha1t4b3b3.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%2F64fw5ubsua8ha1t4b3b3.png" alt="Image description" width="730" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the root directory, open the &lt;code&gt;package.json&lt;/code&gt; file and replace &lt;code&gt;"firebase": "8.10.0"&lt;/code&gt; in the dependencies object with &lt;code&gt;"firebase": "9.2.0"&lt;/code&gt;. Now, let’s install our app’s dependencies by running the following command in the terminal:&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 
$ cd functions
$ npm install 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Although we’ve set up and installed all of our app’s dependencies, if we try running the app with &lt;code&gt;npm start&lt;/code&gt;, it will throw errors. To avoid this, we need to fix our app’s breaking changes, which we’ll do shortly.&lt;/p&gt;

&lt;h2&gt;
  
  
  React app structure
&lt;/h2&gt;

&lt;p&gt;The structure for the &lt;code&gt;src&lt;/code&gt; directory of our app is as follows, but we’ve removed all the style files to make it look shorter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src
 ┣ Checkout
 ┃ ┣ Checkout.js
 ┃ ┣ CheckoutProduct.js
 ┃ ┗ Subtotal.js
 ┣ Header
 ┃ ┗ Header.js
 ┣ Home
 ┃ ┣ Home.js
 ┃ ┗ Product.js
 ┣ Login
 ┃ ┗ Login.js
 ┣ Orders
 ┃ ┣ Order.js
 ┃ ┗ Orders.js
 ┣ Payment
 ┃ ┣ axios.js
 ┃ ┗ Payment.js
 ┣ App.js
 ┣ firebase.js
 ┣ index.js
 ┣ reducer.js
 ┣ reportWebVitals.js
 ┗ StateProvider.js
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We’ll only be working with the files that use Firebase services, &lt;code&gt;firebase&lt;/code&gt;, &lt;code&gt;App.js&lt;/code&gt;, &lt;code&gt;Header.js&lt;/code&gt;, &lt;code&gt;Login.js&lt;/code&gt;, &lt;code&gt;Payment.js&lt;/code&gt;, and &lt;code&gt;Orders.js&lt;/code&gt;,&lt;/p&gt;

&lt;h2&gt;
  
  
  Refactoring the Amazon clone to a modular approach
&lt;/h2&gt;

&lt;p&gt;Let’s update to the v9.x compat library, helping us to progressively migrate to a modular approach until we no longer have any need for the compat library.&lt;/p&gt;

&lt;p&gt;The upgrade process follows a repeating pattern; first, it refactors code for a single service like authentication to the modular style, then removes the compat library for that service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Update imports to the v9.x compat library
&lt;/h2&gt;

&lt;p&gt;Head to the &lt;code&gt;firebase.js&lt;/code&gt; file in the &lt;code&gt;src&lt;/code&gt; directory and modify the v8.x import to look like the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import firebase from 'firebase/app';
import 'firebase/auth';
import 'firebase/firestore';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With just a few alterations, we’ve updated the app to the v9.x compat. Now, we can start our app with &lt;code&gt;npm start&lt;/code&gt;, and it won’t throw any errors. We should also start the Firebase function locally to expose the API that gets the client secret from Strapi.&lt;/p&gt;

&lt;p&gt;In your terminal, change to the &lt;code&gt;functions&lt;/code&gt; directory and run the following command to start the function:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ firebase emulators:start&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Refactoring authentication codes
&lt;/h2&gt;

&lt;p&gt;In the &lt;code&gt;Login.js&lt;/code&gt;, &lt;code&gt;App.js&lt;/code&gt;, and &lt;code&gt;Header.js&lt;/code&gt;, we used the Firebase authentication service. First, let’s refactor the code in the &lt;code&gt;Login.js&lt;/code&gt; file, where we created the functionality to create a user and sign them in with the Firebase &lt;code&gt;createUserWithEmailAndPassword&lt;/code&gt; and &lt;code&gt;signInWithEmailAndPassword&lt;/code&gt; methods. When we scan through the &lt;code&gt;Login.js&lt;/code&gt; file, we’ll see the following v8.x code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Login/Login.js
const signIn = e =&amp;gt; {
    ...
    // signIn an existing user with email and password
    auth
      .signInWithEmailAndPassword(email, password)
      ....
  }

  const regiter = e =&amp;gt; {
    ...
    // Create a new user with email and password using firebase
    auth
      .createUserWithEmailAndPassword(email, password)
      ....
  }  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To follow the modular approach, we’ll import the &lt;code&gt;signInWithEmailAndPassword&lt;/code&gt; and &lt;code&gt;createUserWithEmailAndPassword&lt;/code&gt; methods from the &lt;code&gt;auth&lt;/code&gt; module, then update the code. The refactored version will look like the code below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Login/Login.js
import {signInWithEmailAndPassword, createUserWithEmailAndPassword} from 'firebase/auth'

...
const signIn = e =&amp;gt; {
  ...
  // signIn an existing user with email and password
  signInWithEmailAndPassword(auth, email, password)
  ...
}
const regiter = e =&amp;gt; {
  ...
  // Create a new user with email and password using firebase
  createUserWithEmailAndPassword(auth, email, password)
  ...
}  
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, let’s refactor the &lt;code&gt;App.js&lt;/code&gt; and &lt;code&gt;Header.js&lt;/code&gt; files. In the &lt;code&gt;App.js&lt;/code&gt; file, we used the &lt;code&gt;onAuthStateChanged&lt;/code&gt; method to monitor changes in the user’s sign in state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/App.js
useEffect(() =&amp;gt; {
  auth.onAuthStateChanged(authUser =&amp;gt; {
    ...
  })
}, [])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The modular v9.x of the code above looks like the following segment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/App.js
import {onAuthStateChanged} from 'firebase/auth'

...
useEffect(() =&amp;gt; {
  onAuthStateChanged(auth, authUser =&amp;gt; {
    ...
  })
}, [])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;code&gt;Header.js&lt;/code&gt; file, we used the &lt;code&gt;signOut&lt;/code&gt; method to sign out authenticated users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Header/Header.js
const handleAuthentication = () =&amp;gt; {
  ...
     auth.signOut()
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update the code above to look like the code snippet below:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Header/Header.js
import {signOut} from 'firebase/auth'
...
const handleAuthentication = () =&amp;gt; {
  ...
    signOut(auth)
  ...
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we’re done refactoring all the authentication codes, it’s time to remove the compat library to gain our size benefit. In the &lt;code&gt;firebase.js&lt;/code&gt; file, replace &lt;code&gt;import 'firebase/compat/auth'&lt;/code&gt; and &lt;code&gt;const auth = firebaseApp.auth()&lt;/code&gt; with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {getAuth} from 'firebase/auth'
...
const auth = getAuth(firebaseApp)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Refactoring Cloud Firestore codes
&lt;/h2&gt;

&lt;p&gt;The process for refactoring Cloud Firestore code is similar to what we just did with the authentication codes. We’ll be working with the &lt;code&gt;Payment.js&lt;/code&gt; and &lt;code&gt;Orders.js&lt;/code&gt; files. In &lt;code&gt;Payment.js&lt;/code&gt;, we use Firestore to store the data of users that paid for products on the site. Inside Payment.js, we’ll find the following v8.x code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Payment/Payment.js
...
db
  .collection('users')
  .doc(user?.uid)
  .collection('orders')
  .doc(paymentIntent.id)
  .set({
    basket: basket,
    amount: paymentIntent.amount,
    created: paymentIntent.created
  })
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To refactor the code, we first have to import the necessary functions, then update the rest of the code. The v9.x of the code above looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Payment/Payment.js
import {doc, setDoc} from 'firebase/firestore'

...
const ref = doc(db, 'users', user?.uid, 'orders', paymentIntent.id)
setDoc(ref, {
  basket: basket,
  amount: paymentIntent.amount,
  created: paymentIntent.created
})
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the &lt;code&gt;Orders.js&lt;/code&gt; file, we used the &lt;code&gt;onSnapshot&lt;/code&gt; method to get real-time updates of the data in Firestore. the v9.x code looks like the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;// src/Orders/Orders.js
....
db
  .collection('users')
  .doc(user?.uid)
  .collection('orders')
  .orderBy('created', 'desc')
  .onSnapshot(snapshot =&amp;gt; {
     setOrders(snapshot.docs.map(doc =&amp;gt; ({
       id: doc.id,
       data: doc.data()
     })))
  })
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The v9.x equivalent is as follows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import {query, collection, onSnapshot, orderBy} from 'firebase/firestore'

...
const orderedOrders = query(ref, orderBy('created', 'desc'))
onSnapshot(orderedOrders, snapshot =&amp;gt; {
     setOrders(snapshot.docs.map(doc =&amp;gt; ({
       id: doc.id,
       data: doc.data()
     })))
  })
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now that we’re done refactoring all the Cloud Firestore codes, let’s remove the compat library. In the &lt;code&gt;firebase.js&lt;/code&gt; file, replace &lt;code&gt;import 'firebase/compat/firestore'&lt;/code&gt; and &lt;code&gt;const db = firebaseApp.firestore()&lt;/code&gt; with the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { getFirestore } from "firebase/firestore";
...
const db = getFirestore(firebaseApp)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Update initialization code
&lt;/h2&gt;

&lt;p&gt;The final step in upgrading our Amazon clone app to the new modular v9.x syntax is to update the initialization code. In the &lt;code&gt;firebase.js&lt;/code&gt; file, replace &lt;code&gt;import firebase from 'firebase/compat/app'&lt;/code&gt;; and const &lt;code&gt;firebaseApp = firebase.initializeApp(firebaseConfig)&lt;/code&gt; with the following functions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { initializeApp } from "firebase/app"
...
const firebaseApp = initializeApp(firebaseConfig)
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, we’ve successfully upgraded our app to follow the new v9.x modular format.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
The new Firebase v9.x SDK provides a faster web experience than its v8.x predecessor, thanks to its modular format. This tutorial introduced the new SDK and explained how to use its compact library to reflector a React app. You should be able to follow the methods and steps outlined in this article to upgrade your own apps to the newest version.&lt;/p&gt;

</description>
      <category>welcome</category>
      <category>learning</category>
      <category>fullstack</category>
      <category>community</category>
    </item>
    <item>
      <title>Getting Started with Blockchain Development: A Step-by-Step Guide to Deploying Your First DApp.</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Fri, 07 Oct 2022 12:54:21 +0000</pubDate>
      <link>https://dev.to/techiechristie/getting-started-with-blockchain-development-a-step-by-step-guide-to-deploying-your-first-dapp-58h0</link>
      <guid>https://dev.to/techiechristie/getting-started-with-blockchain-development-a-step-by-step-guide-to-deploying-your-first-dapp-58h0</guid>
      <description>&lt;p&gt;With the birth of Ethereum, the first programmable blockchain, web2 developers started delving into the new exciting blockchain development, dApp and the whole decentralized world. And since we are still relatively early into the web3 space, it is important, either as a web2 developer testing your feet on web3 or as a newbie just trying to get a hang around the software development to pay attention and learn the steps required for building projects on blockchain.&lt;/p&gt;

&lt;p&gt;Creating your first and subsequent dApps requires the basic knowledge of the web3 tech stack and the steps you will use in  the development. Generally, there are different stages and processes required.  In this step by step guide, you will find the necessary steps, tools, and stages required for your first dApp deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Blockchain Different From Smart Contract:
&lt;/h3&gt;

&lt;p&gt;Smart contracts and blockchain are two distinct ideas that are closely related to one another. A blockchain is a type of digital network that is created and maintained by many computers running certain software. A distributed ledger tracking transactions makes up the blockchain. Such transactions' information cannot be changed once it has been entered into the system. Since blockchains are completely decentralized, no single entity has control over them.&lt;/p&gt;

&lt;h3&gt;
  
  
  What are dAapps and How Important Are They?
&lt;/h3&gt;

&lt;p&gt;To get a full idea of what dApps means, we will need to split the word “dApp”. Breaking the word “D-app”, the ‘D’ stands for decentralized and the "app" stands for application. This already gives a much clearer meaning. Just like in web2 here we have decentralization. dApp could be a decentralized mobile application, decentralized websites, decentralized games e.t.c. Conclusively dApps are defined by interaction with the blockchain network.&lt;br&gt;
In the following section, we will be building a mood detector app that communicates with the blockchain, let’s delve in.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites:
&lt;/h3&gt;

&lt;p&gt;To build a fully functioning Dapp, you will need to work on three main stages/components which require different stacks. Here are the basic pre requisites.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
First you will need to develop your application’s frontend (A basic html web page): 
This will come easy for you if you are a web2 developer as we will be using tech stacks you are familiar with.  To do this you will need;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Terminal (e.g Command Prompt)
2. Code editor (e.g Visual Studio code or Atom)
3. Basic knowledge of html and CSS. 
4. Install the http server. Use anything you like, but for this tutorial we will use [`lite-server`(https://www.npmjs.com/package/lite-server):
- Install Node.js ([Download and Instructions](https://nodejs.org/en/download/))
- Install Lite-server (with NPM in the terminal/command prompt):
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Next, you will need to create a basic smart contract: This will require 

&lt;ol&gt;
&lt;li&gt; &lt;a href="https://metamask.io/"&gt;Metamask&lt;/a&gt; account&lt;/li&gt;
&lt;li&gt;Smart contract editor (e.g IDE Remix or Hardhat); for this tutorial we would recommend &lt;a href="https://remix.ethereum.org/"&gt;IDE Remix&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Create your first dApp:
&lt;/h3&gt;

&lt;p&gt;We will create a mood decentralized application that simply reads and writes value to the blockchain. We will need a label, input, and buttons.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gZxzNm3i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664883913579_1.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gZxzNm3i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664883913579_1.JPG" alt="" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create your dApp’s frontend
&lt;/h3&gt;

&lt;p&gt;This should be a simple html webpage that displays your dApp’s user interface.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;To do this:&lt;/strong&gt;&lt;br&gt;
In your terminal (for this tutorial we are using command prompt, create a new folder using the command ‘mkdir ’&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g9Glu2tB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659347940852_1.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g9Glu2tB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659347940852_1.JPG" alt="" width="304" height="39"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your code editor (for this tutorial we are using Visual Studio Code), open the folder you have just created in your terminal. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--koDLf9IA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659349122352_2.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--koDLf9IA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659349122352_2.JPG" alt="" width="690" height="100"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In your folder, create a new file called &lt;code&gt;index.html&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FT_qYQF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659349330482_2.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FT_qYQF3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659349330482_2.JPG" alt="" width="615" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open &lt;code&gt;index.html&lt;/code&gt; and then create HTML boilerplate&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8" /&amp;gt;
    &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&amp;gt;
    &amp;lt;title&amp;gt;My First Dapp&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We will create a simple app that reads and writes value to the blockchain. We will need a label, input, and buttons.&lt;/p&gt;

&lt;p&gt;Next, inside the body tag, add some text (Your project tittle), a label and input.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;body&amp;gt;
  &amp;lt;div&amp;gt;
    &amp;lt;h1&amp;gt;This is a Mood Decentralized App!&amp;lt;/h1&amp;gt;
    &amp;lt;p&amp;gt;Here we can either set or get the mood:&amp;lt;/p&amp;gt;
    &amp;lt;label for="mood"&amp;gt;Input Mood:&amp;lt;/label&amp;gt; &amp;lt;br /&amp;gt;
    &amp;lt;input type="text" id="mood" /&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Then add buttons&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;button onclick="getMood()"&amp;gt;Get Mood&amp;lt;/button&amp;gt;
&amp;lt;button onclick="setMood()"&amp;gt;Set Mood&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Customize your app and make it look nicer, you can use your preferred style, color, font size and family &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;head&amp;gt;
&amp;lt;style&amp;gt;
  body {
    text-align: center;
    font-family: Arial, Helvetica, sans-serif;
  }

  div {
    width: 20%;
    margin: 0 auto;
    display: flex;
    flex-direction: column;
  }

  button {
    width: 100%;
    margin: 10px 0px 5px 0px;
  }
&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Serve the webpage via a terminal/command prompt from the directory that has &lt;code&gt;index.html&lt;/code&gt; in it and run: &lt;code&gt;lite-server&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--124c1ZwF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659358794931_2.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--124c1ZwF--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659358794931_2.JPG" alt="" width="855" height="142"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--D9g8JCUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659359059801_2.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--D9g8JCUC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1659359059801_2.JPG" alt="" width="579" height="38"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Congratulations! you have just completed stage one and your front-end is fully ready.&lt;/strong&gt;&lt;br&gt;
Go to &lt;a href="http://127.0.0.1:3000/"&gt;http://127.0.0.1:3000/&lt;/a&gt; in your browser to view your page!&lt;/p&gt;

&lt;h3&gt;
  
  
  IT’S TIME TO CREATE A BASIC SMART CONTRACT.
&lt;/h3&gt;

&lt;p&gt;To create a Solidity Smart Contract, you will need an editor and for this guide we will use the online &lt;a href="https://remix.ethereum.org/"&gt;IDE Remix.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: Not sure how to use it then check this &lt;a href="https://www.youtube.com/watch?v=pdJttvcAV1c"&gt;video&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Remix and ensure the "Solidity Compiler" and "Deploy and Run Transactions" tabs are present. If they are not present, enable them in the &lt;a href="https://remix-ide.readthedocs.io/en/latest/"&gt;plugin manager&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s Now time to write your contract&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First specify the solidity version and add a license&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a new solidity file in remix named &lt;code&gt;mood.sol&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;// SPDX-License-Identifier: MIT&lt;br&gt;
 pragma solidity ^0.8.1;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Define the contract&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;contract MoodDiary{&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Inside the contract create a variable called mood&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;string mood;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next, create Read and Write functions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;//create a function that writes a mood to the smart contract&lt;br&gt;
 function setMood(string memory _mood) public{&lt;br&gt;
     mood = _mood;&lt;br&gt;
 }&lt;/p&gt;

&lt;p&gt;//create a function the reads the mood from the smart contract&lt;br&gt;
 function getMood() public view returns(string memory){&lt;br&gt;
     return mood;&lt;br&gt;
 }&lt;/p&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your Smart Contract code is now ready and all your code put together should look like this.&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.1;
contract MoodDiary{
 }
string mood;
//create a function that writes a mood to the smart contract
 function setMood(string memory _mood) public{
     mood = _mood;
 }

 //create a function the reads the mood from the smart contract
 function getMood() public view returns(string memory){
     return mood;
 }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now that we have our contract ready, the next step is to deploy the contract. We will be deploying the contract on the &lt;a href="https://community.metamask.io/t/georli-testnet-network/19010"&gt;Goerli Testnet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;To deploy your smart contract, &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect your &lt;a href="https://blog.cryptostars.is/goerli-g%C3%B6rli-testnet-network-to-metamask-and-receiving-test-ethereum-in-less-than-2-min-de13e6fe5677"&gt;Metamask to the Goerli Testnet&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Select the correct compiler version to match the solidity contract. (In the compile tab)&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Compile the code using the "Solidity Compiler" tab. &lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lrBjjLX9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664884395559_2.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lrBjjLX9--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664884395559_2.JPG" alt="" width="880" height="420"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploy the contract under the "Deploy and Run Transactions" tab&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the Deployed Contracts section, you can test out your functions on the Remix Run tab to make sure your contract works as expected!&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt;&lt;br&gt;
you have now deployed your Smartcontract.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nZiCxAAa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664884611645_3.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nZiCxAAa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664884611645_3.JPG" alt="" width="880" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;PS: Your contract will not be deployed if you do not compile it first.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a temporary folder to save important details.
&lt;/h3&gt;

&lt;p&gt;The folder will hold&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The deployed contract's address.&lt;/li&gt;
&lt;li&gt;The contract ABI
&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U-E3cIBT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_C724ED3C7A35F7A6903F577DF49266E8E4171F3DA91876B906368AD11E0C6B1F_1664885380868_abi.JPG" alt="" width="880" height="553"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Connect Your HTML Webpage to Your Deployed Smart Contract
&lt;/h3&gt;

&lt;p&gt;in your local text editor in &lt;code&gt;index.html&lt;/code&gt;, add the following code to your html page:&lt;/p&gt;

&lt;p&gt;Import the &lt;code&gt;Ethers.js&lt;/code&gt; source into your &lt;code&gt;index.html&lt;/code&gt; page inside a new set of script tags:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;script
  src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"
  type="application/javascript"
&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;script&amp;gt;
  ////////////////////
  //INPUT YOUR CODE HERE
  ////////////////////
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Inside the script tag, import the contract ABI (&lt;a href="https://docs.soliditylang.org/en/develop/abi-spec.html"&gt;what is that?&lt;/a&gt;) and specify the contract address on our provider's blockchain:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MoodContractAddress = "&amp;lt;contract address&amp;gt;";
  const MoodContractABI = &amp;lt;contract ABI&amp;gt;
  let MoodContract;
  let signer;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;For the contract ABI, we want to specifically navigate to the JSON Section. We need to describe our smart contract in &lt;a href="https://docs.soliditylang.org/en/develop/abi-spec.html#json"&gt;JSON&lt;/a&gt; format.&lt;/p&gt;

&lt;p&gt;Since we have two methods, this should start as an array, with 2 objects:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MoodContractABI = [{}, {}]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;From the above page, each object should have the following fields: &lt;code&gt;constant&lt;/code&gt;, &lt;code&gt;inputs&lt;/code&gt;, &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;outputs&lt;/code&gt;, &lt;code&gt;payable&lt;/code&gt;, &lt;code&gt;stateMutability&lt;/code&gt; and &lt;code&gt;type&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Your end result should look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const MoodContractABI = [
        {
                "inputs": [],
                "name": "getMood",
                "outputs": [
                        {
                                "internalType": "string",
                                "name": "",
                                "type": "string"
                        }
                ],
                "stateMutability": "view",
                "type": "function"
        },
        {
                "inputs": [
                        {
                                "internalType": "string",
                                "name": "_mood",
                                "type": "string"
                        }
                ],
                "name": "setMood",
                "outputs": [],
                "stateMutability": "nonpayable",
                "type": "function"
        }
]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Next, Define an ethers provider. In our case, this is Goerli:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const provider = new ethers.providers.Web3Provider(window.ethereum, "goerli");
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Request access to the user's wallet and connect the signer to your metamask account (we use &lt;code&gt;[0]&lt;/code&gt; as the default), and define the contract object using your contract address, ABI, and signer&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider.send("eth_requestAccounts", []).then(() =&amp;gt; {
  provider.listAccounts().then((accounts) =&amp;gt; {
    signer = provider.getSigner(accounts[0]);
    MoodContract = new ethers.Contract(
      MoodContractAddress,
      MoodContractABI,
      signer
    );
  });
});
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Create asynchronous functions to call your smart contract functions&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;async function getMood() {
  const getMoodPromise = MoodContract.getMood();
  const Mood = await getMoodPromise;
  console.log(Mood);
}

async function setMood() {
  const mood = document.getElementById("mood").value;
  const setMoodPromise = MoodContract.setMood(mood);
  await setMoodPromise;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Connect your functions to your html buttons&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;button onclick="getMood()"&amp;gt;Get Mood&amp;lt;/button&amp;gt;
&amp;lt;button onclick="setMood()"&amp;gt;Set Mood&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After the above step, your &lt;code&gt;index.html&lt;/code&gt; file should have the following code&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;
  &amp;lt;head&amp;gt;
    &amp;lt;meta charset="UTF-8" /&amp;gt;
    &amp;lt;meta http-equiv="X-UA-Compatible" content="IE=edge" /&amp;gt;
    &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0" /&amp;gt;
    &amp;lt;title&amp;gt;My First dApp&amp;lt;/title&amp;gt;
    &amp;lt;style&amp;gt;
        *{
            background-color: beige;
            font-size: larger;
        }
        body {
          text-align: center;
          font-family: Arial, Helvetica, sans-serif;
        }

        div {
          width: 20%;
          margin: 0 auto;
          display: flex;
          flex-direction: column;
        }
        p{
            font-size: large;
        }

        button {
          width: 100%;
          margin: 10px 0px 5px 0px;
        }
      &amp;lt;/style&amp;gt;
  &amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;
    &amp;lt;div&amp;gt;
        &amp;lt;h1&amp;gt;This Christie's First Decentralized App!&amp;lt;/h1&amp;gt;
        &amp;lt;p&amp;gt;Here we can set or get the mood:&amp;lt;/p&amp;gt;
        &amp;lt;label for="mood"&amp;gt;Input Mood:&amp;lt;/label&amp;gt; &amp;lt;br /&amp;gt;
        &amp;lt;input type="text" id="mood" /&amp;gt;
        &amp;lt;button onclick="getMood()"&amp;gt;Get Mood&amp;lt;/button&amp;gt;
        &amp;lt;button onclick="setMood()"&amp;gt;Set Mood&amp;lt;/button&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;script
  src="https://cdn.ethers.io/lib/ethers-5.2.umd.min.js"
  type="application/javascript"
&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script&amp;gt;
  const MoodContractAddress = "0xd9145CCE52D386f254917e481eB44e9943F39138";
  const MoodContractABI = [
    {
        "inputs": [
            {
                "internalType": "string",
                "name": "_mood",
                "type": "string"
            }
        ],
        "name": "setMood",
        "outputs": [],
        "stateMutability": "nonpayable",
        "type": "function"
    },
    {
        "inputs": [],
        "name": "getMood",
        "outputs": [
            {
                "internalType": "string",
                "name": "",
                "type": "string"
            }
        ],
        "stateMutability": "view",
        "type": "function"
    }
]
  let MoodContract;
  let signer;
  const provider = new ethers.providers.Web3Provider(window.ethereum, "goerli");
  provider.send("eth_requestAccounts", []).then(() =&amp;gt; {
  provider.listAccounts().then((accounts) =&amp;gt; {
    signer = provider.getSigner(accounts[0]);
    MoodContract = new ethers.Contract(
      MoodContractAddress,
      MoodContractABI,
      signer
    );
  });
});
async function getMood() {
  const getMoodPromise = MoodContract.getMood();
  const Mood = await getMoodPromise;
  console.log(Mood);
}
async function setMood() {
  const mood = document.getElementById("mood").value;
  const setMoodPromise = MoodContract.setMood(mood);
  await setMoodPromise;
}
&amp;lt;/script&amp;gt;
  &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Congratulations! You now have a fully functioning decentralized application that can set or get mood.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Time to test your work.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Got your webserver up? Go to &lt;a href="http://127.0.0.1:3000/"&gt;http://127.0.0.1:3000/&lt;/a&gt; in your browser to view or open your &lt;code&gt;index.html&lt;/code&gt; file in your browser!&lt;/li&gt;
&lt;li&gt;Test your functions and approve transactions as needed through Metamask. Note block times are ~15 seconds... so wait a bit to read the state of the blockchain&lt;/li&gt;
&lt;li&gt;See your contract and transaction info via &lt;a href="https://goerli.etherscan.io/"&gt;https://goerli.etherscan.io/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open a console (&lt;code&gt;Ctrl + Shift + i&lt;/code&gt;) in the browser to see if the magic happens as you press those buttons&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Conclusion:
&lt;/h3&gt;

&lt;p&gt;Celebrate! You've just created a website that communicates with an online Ethereum testnet that is operational and active. Few people can proudly claim to have done it!&lt;br&gt;
In this article, we have learned about the basics of blockchain and how to create your first smart contract even if you are a complete beginner.&lt;br&gt;
Resources:&lt;/p&gt;

&lt;p&gt;-&lt;a href="https://github.com/Christianaojo/basicDapp"&gt;Github&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Back to Basics: Build a Price Page Component With CSS Grid.</title>
      <dc:creator>Christianaojo</dc:creator>
      <pubDate>Tue, 04 Oct 2022 08:54:22 +0000</pubDate>
      <link>https://dev.to/techiechristie/back-to-basics-build-a-price-page-component-with-css-grid-3951</link>
      <guid>https://dev.to/techiechristie/back-to-basics-build-a-price-page-component-with-css-grid-3951</guid>
      <description>&lt;h3&gt;
  
  
  Goal:
&lt;/h3&gt;

&lt;p&gt;In this tutorial, you will learn about how to use basic HTML and CSS to create and design a highly responsive single price grid component. This is a very beginner-level challenge from &lt;a href="https://www.frontendmentor.io/challenges/single-price-grid-component-5ce41129d0ff452fec5abbbc"&gt;frontend mentor&lt;/a&gt;.&lt;br&gt;
The main assignment is to build out this landing page based on the designs provided in the starter code. Your users should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View the optimal layout for the page depending on the screen size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Desktop View:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lEH9MuFM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wu6c6s0mv1exhstcydl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lEH9MuFM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1wu6c6s0mv1exhstcydl.jpg" alt="price grid desktop view" width="880" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mobile View:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Z1_hpn0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b92wnmo58715vm0tac0o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Z1_hpn0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/b92wnmo58715vm0tac0o.jpg" alt="price grid mobile view " width="880" height="645"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisite:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Basic knowledge of  HTML and CSS.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Started
&lt;/h3&gt;

&lt;p&gt;For some people, this challenge might be a walk in the park such that you can easily do with your eyes closed, while some it might be challenging and you will be learning one or two new concepts from. So, whether you are a beginner or a pro, this tutorial will be of great health to further develop your skills.&lt;/p&gt;

&lt;p&gt;The first step is to use HTML to create a rough draft or blueprint of the single price grid . A single price grid Component's appearance and feel will then be created in accordance with the Design using CSS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Define Basic HTML Components/Structure
&lt;/h3&gt;

&lt;p&gt;This defines the project type as HTML and gives it the language English.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   &amp;lt;!DOCTYPE html&amp;gt;
    &amp;lt;html lang="en"&amp;gt;
    &amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Now define the head tag within the HTML tag. &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;head&amp;gt;
       &amp;lt;meta charset="UTF-8"&amp;gt;
      &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt; 
      &amp;lt;link rel="icon" type="image/png" sizes="32x32" href="./images/favicon-32x32.png"&amp;gt;
       &amp;lt;title&amp;gt;Single Price Grid Component&amp;lt;/title&amp;gt;
    &amp;lt;/head&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Just below the head tag, create a body tag.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;  &amp;lt;body&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;After this step, your code should look like this:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html lang="en"&amp;gt;

&amp;lt;!-- Head Section--&amp;gt;
&amp;lt;head&amp;gt;
  &amp;lt;meta charset="UTF-8"&amp;gt;
  &amp;lt;meta name="viewport" content="width=device-width, initial-scale=1.0"&amp;gt; 
  &amp;lt;link rel="icon" type="image/png" sizes="32x32" href="./images/favicon-32x32.png"&amp;gt;
  &amp;lt;link rel="stylesheet" href="style.css"&amp;gt;
   &amp;lt;title&amp;gt;Single Price Grid Component&amp;lt;/title&amp;gt;
  &amp;lt;/head&amp;gt;

&amp;lt;!-- Body Section--&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Create the Main Structure of the Single Price Grid Component
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;As you can see in the design there are three main sections, One section has a white background, the second with a cyan background and the third section with a light cyan background. So what we do is:
- First, we divided the three sections as header sections for the white background, price section for the cyan background and why us for the light cyan.
- Then we wrap those three sections inside a parent container called `container`.


&amp;lt;!-- Parent Wrap--&amp;gt;
&amp;lt;div class="container"&amp;gt;
   &amp;lt;!-- white background--&amp;gt;
   &amp;lt;header id="main-header"&amp;gt;
   &amp;lt;/header&amp;gt;
   &amp;lt;!-- cyan background Section--&amp;gt;
   &amp;lt;div class="price"&amp;gt;
   &amp;lt;/div&amp;gt;
&amp;lt;div class="why-us"&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 are now done developing the main structure for the single price grid component. It is time for us to work on each section and fill them with the necessary contents.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As you can see, the white background has taken the full container. Therefore what we do is instead of using white as an we use a background color to fully cover the background and we then input the provided content. &lt;/li&gt;
&lt;li&gt;When we move to the second section, there is a heading and a subheading, then we have the paragraph and underneath we have a call to action (CTA) button called sign-up.&lt;/li&gt;
&lt;li&gt;For the third section, we have the heading and the body text.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At the end of this section, your code should be very similar to this&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;div class="container"&amp;gt;
    &amp;lt;header id="main-header"&amp;gt;
      &amp;lt;h4 class="primary"&amp;gt;Join our community&amp;lt;/h4&amp;gt;
      &amp;lt;p class="secondary"&amp;gt;30-day, hassle-free money back guarantee&amp;lt;/p&amp;gt;
      &amp;lt;p class="gray small-text"&amp;gt;
        Gain access to our full library of tutorials along with expert code reviews. 
        Perfect for any developers who are serious about honing their skills.
      &amp;lt;/p&amp;gt;
    &amp;lt;/header&amp;gt;
    &amp;lt;section id="price"&amp;gt;
      &amp;lt;h4&amp;gt;Monthly Subscription&amp;lt;/h4&amp;gt;
      &amp;lt;p&amp;gt;&amp;lt;span class="large-text"&amp;gt;&amp;amp;dollar;29&amp;lt;/span&amp;gt;&amp;lt;span class="off-white"&amp;gt; &amp;amp;nbsp per month&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;
      &amp;lt;p class="small-text"&amp;gt;Full access for less than &amp;amp;dollar;1 a day&amp;lt;/p&amp;gt;
      &amp;lt;a class="btn" href="#"&amp;gt;Sign Up&amp;lt;/a&amp;gt;
    &amp;lt;/section&amp;gt;
    &amp;lt;section class="why-us"&amp;gt;
      &amp;lt;h4&amp;gt;Why Us&amp;lt;/h4&amp;gt;
      &amp;lt;p&amp;gt;Tutorials by industry experts&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Peer &amp;amp;amp; expert code review&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Coding exercises&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Access to our GitHub repos&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Community forum&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;Flashcard decks&amp;lt;/p&amp;gt;
      &amp;lt;p&amp;gt;New videos every week&amp;lt;/p&amp;gt;
    &amp;lt;/section&amp;gt;
  &amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You can copy the content in the above code from my github repository.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add the Footer Section
&lt;/h3&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;footer&amp;gt;
    &amp;lt;p class="attribution"&amp;gt;
      Challenge by &amp;lt;a href="https://www.frontendmentor.io?ref=challenge" target="_blank"&amp;gt;Frontend Mentor&amp;lt;/a&amp;gt;. 
      Coded by &amp;lt;a href="#"&amp;gt;Christiana Ojo&amp;lt;/a&amp;gt;.
    &amp;lt;/p&amp;gt;
  &amp;lt;/footer&amp;gt; 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;— — And with that, we are done with the html blueprint. It’s time for us to check the output.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Klup1mW0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_EC25846EEF1F41D983112EDAB06C6BE85C07C92CF5CEFAB1599DD5C4B8135B5B_1663240524319_html.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Klup1mW0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_EC25846EEF1F41D983112EDAB06C6BE85C07C92CF5CEFAB1599DD5C4B8135B5B_1663240524319_html.JPG" alt="" width="789" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the output of our HTML code, and it looks quite ugly??? &lt;br&gt;
&lt;strong&gt;But wait, don’t judge too soon, it is just the beginning and the best part is yet to come.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the following section, we will be adding CSS to our application, let's delve in:&lt;/p&gt;

&lt;h3&gt;
  
  
  Styling With CSS
&lt;/h3&gt;

&lt;p&gt;We have reached the best part as we are now ready to add color and style to our project, it’s time to get our hands dirty as we will be styling the desktop view first. This means we'll start the styling for the mobile view first and then we’ll adjust the styling for the smaller screens using media queries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import the External Style Sheet into the HTML file&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;      &amp;lt;link rel="stylesheet" href="style.css"&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;This line of code will link the CSS styling with our html file. &lt;/p&gt;

&lt;p&gt;It’s now time to create our CSS file &lt;code&gt;style.css&lt;/code&gt; as defined in our HTML file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Import external fonts into the CSS file&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@import url('https://fonts.googleapis.com/css?family=Karla&amp;amp;display=swap');
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Use &lt;code&gt;::root&lt;/code&gt; to declare the colors you will be using.&lt;/strong&gt; &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;:root {
  --light-gray: hsl(204, 43%, 93%);
  --cyan: hsl(179, 62%, 43%);
  --off-cyan: hsla(179, 62%, 43%, 0.699);
  --bright-yellow: hsl(71, 73%, 54%);
  --grayish-blue: hsl(218, 22%, 67%);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;You may be thinking it is easier to just input the colors at every point so why use &lt;code&gt;::root?&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The :root CSS pseudo-class matches the root element of a tree representing the document. Also, :root is where you have declared and initialized the global vars that you can reuse throughout your stylesheet.&lt;/li&gt;
&lt;li&gt;Here the &lt;code&gt;var()&lt;/code&gt; function is used to insert the value of a CSS variable. When you use CSS variables it has access to the DOM, which means that you can create variables with local or global scope, change the variables with JavaScript, and change the variables based on media queries.&lt;/li&gt;
&lt;li&gt;We will be using &lt;code&gt;:root&lt;/code&gt;  rather than copy and paste the colors over and over again, so we can simply place them in the variable and reuse the &lt;code&gt;var()&lt;/code&gt; value throughout the stylesheet. It’s simple and easy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Style the Universal Selector (*)
&lt;/h3&gt;

&lt;p&gt;we are using a universal selector (*) to act as the default styling throughout the page. Therefore rather than repeating the same styling in every class, we can simply define the styling in a universal selector once and it will serve as the default styling throughout the page.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  line-height: 1.6;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Style the &lt;code&gt;body element&lt;/code&gt; section.
&lt;/h3&gt;

&lt;p&gt;It's now time to add color, background, and give the design style inside of the body element.&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;body {
  font-family: 'Karla', sans-serif;
  background: var(--light-gray);
  height: 100vh;
  padding: 5rem 2rem;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Give H4 and the P Tags the Necessary Margin
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;h4, p {
  margin: 1rem 0;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Style the Different Classes
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;.primary {color: var(--cyan); }
.secondary {color: var(--bright-yellow);}
.gray {color: var(--grayish-blue);}
.off-white{color: rgba(255, 255, 255, 0.705);}
.large-text{font-size: 1.5rem;}
.small-text{font-size: .9rem;}

/*button*/
.btn {
  display: block;
  text-align: center;
  color: #fff;
  font-weight: 600;
  width: 100%;
  background: var(--bright-yellow);
  padding: .5rem 1.25rem; 
  text-decoration: none;
  border-radius: 8px;
  box-shadow: .1rem .1rem .9rem .2rem  rgba(92, 90, 90, 0.25);
}
.btn:hover {
  background: var(--light-gray);
  color: var(--cyan);
}

/* class container */
.container {
  background: white;
  border-radius: 5px;
  box-shadow: .1rem .1rem .9rem .2rem  rgba(150, 148, 148, 0.25);
}

.container #main-header {
  padding: .15rem 1rem;
}
/* Price Section */
.container #price {
  background: var(--cyan);
  padding: .15rem 1rem 1.5rem 1rem;
  color: #fff;
  border-bottom-left-radius: 4px;
}
/* Why us */
.container .why-us {
  background: var(--off-cyan);
  padding: .15rem 1rem .5rem 1rem;
  color: #fff;
  line-height: 0;
  border-bottom-right-radius: 4px;
}
.container .why-us p {
  font-size: .9rem;
  line-height: .15;
  color: rgba(255, 255, 255, 0.705);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
  
  
  Fix Mobile Responsiveness To Adjust the Styling According to Device Size
&lt;/h3&gt;

&lt;p&gt;For the style for mobile responsiveness, we will be using &lt;code&gt;@mediaquery&lt;/code&gt; tag&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@media screen and (min-width: 594px) {
  body {
    max-width: 700px;
    margin: 0 auto;
  }
  .container {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 200px 250px;
  }
  .container #main-header {
    grid-column: 1 /span 3;
    padding: 1rem 2rem;
    justify-content: center;
  }
  .container #price {
    padding: .75rem 2rem;
  }
  .container .why-us {
    padding: .75rem 2rem;
  }
  .container .why-us p {
    line-height: .4;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Conclusively, your CSS code input put together should look like this &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;@import url('https://fonts.googleapis.com/css?family=Karla&amp;amp;display=swap');
:root {
  --light-gray: hsl(204, 43%, 93%);
  --cyan: hsl(179, 62%, 43%);
  --off-cyan: hsla(179, 62%, 43%, 0.699);
  --bright-yellow: hsl(71, 73%, 54%);
  --grayish-blue: hsl(218, 22%, 67%);
}

* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
  line-height: 1.6;
}
body {
  font-family: 'Karla', sans-serif;
  background: var(--light-gray);
  height: 100vh;
  padding: 5rem 2rem;
}
h4, p {
  margin: 1rem 0;
}

.primary {color: var(--cyan); }
.secondary {color: var(--bright-yellow);}
.gray {color: var(--grayish-blue);}
.off-white{color: rgba(255, 255, 255, 0.705);}
.large-text{font-size: 1.5rem;}
.small-text{font-size: .9rem;}
.btn {
  display: block;
  text-align: center;
  color: #fff;
  font-weight: 600;
  width: 100%;
  background: var(--bright-yellow);
  padding: .5rem 1.25rem; 
  text-decoration: none;
  border-radius: 8px;
  box-shadow: .1rem .1rem .9rem .2rem  rgba(92, 90, 90, 0.25);
}
.btn:hover {
  background: var(--light-gray);
  color: var(--cyan);
}


.container {
  background: white;
  border-radius: 5px;
  box-shadow: .1rem .1rem .9rem .2rem  rgba(150, 148, 148, 0.25);
}

.container #main-header {
  padding: .15rem 1rem;
}
/* Price Section */
.container #price {
  background: var(--cyan);
  padding: .15rem 1rem 1.5rem 1rem;
  color: #fff;
  border-bottom-left-radius: 4px;
}
/* Why us */
.container .why-us {
  background: var(--off-cyan);
  padding: .15rem 1rem .5rem 1rem;
  color: #fff;
  line-height: 0;
  border-bottom-right-radius: 4px;
}
.container .why-us p {
  font-size: .9rem;
  line-height: .15;
  color: rgba(255, 255, 255, 0.705);
}
@media screen and (min-width: 594px) {
  body {
    max-width: 700px;
    margin: 0 auto;
  }
  .container {
    display: grid;
    grid-template-columns: 1fr 1fr;
    grid-template-rows: 200px 250px;
  }
  .container #main-header {
    grid-column: 1 /span 3;
    padding: 1rem 2rem;
    justify-content: center;
  }
  .container #price {
    padding: .75rem 2rem;
  }
  .container .why-us {
    padding: .75rem 2rem;
  }
  .container .why-us p {
    line-height: .4;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;YEAH!! Now we are done with the basic frontend development for the Single Price Grid Component. Now the time has arrived to check the output of what we have done.&lt;/p&gt;

&lt;p&gt;&lt;a href="/static/img/pixel.gif" class="article-body-image-wrapper"&gt;&lt;img src="/static/img/pixel.gif" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZRX5A1Qk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_EC25846EEF1F41D983112EDAB06C6BE85C07C92CF5CEFAB1599DD5C4B8135B5B_1664273841964_1.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZRX5A1Qk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://paper-attachments.dropbox.com/s_EC25846EEF1F41D983112EDAB06C6BE85C07C92CF5CEFAB1599DD5C4B8135B5B_1664273841964_1.JPG" alt="" width="880" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now, check your own output and let me know your thoughts. Did it come as you expected?&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;In this article, we have learned about the basics of CSS grid by building a single price grid component using HTML and CSS.&lt;br&gt;
Thank you for checking this guide out, and do leave your questions in the comment section.&lt;/p&gt;

&lt;p&gt;Resources:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/Christianaojo/Price-Grid-Component"&gt;Github.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.frontendmentor.io/challenges/single-price-grid-component-5ce41129d0ff452fec5abbbc"&gt;Frontend mentor&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

</description>
    </item>
  </channel>
</rss>
