{"id":13460451,"url":"https://github.com/smartcontractkit/full-blockchain-solidity-course-js","last_synced_at":"2025-05-13T15:13:18.464Z","repository":{"id":37010560,"uuid":"448715893","full_name":"smartcontractkit/full-blockchain-solidity-course-js","owner":"smartcontractkit","description":"Learn Blockchain, Solidity, and Full Stack Web3 Development with Javascript","archived":false,"fork":false,"pushed_at":"2024-06-12T05:10:25.000Z","size":4191,"stargazers_count":13240,"open_issues_count":99,"forks_count":3174,"subscribers_count":260,"default_branch":"main","last_synced_at":"2025-04-23T21:43:57.086Z","etag":null,"topics":["alchemy","blockchain","chainlink","dao","defi","eth-security-toolbox","ethereum","hardhat","ipfs","javascript","moralis","nextjs","nft","openzeppelin","reactjs","remix","smart-contracts","solidity","thegraphprotocol","typescript"],"latest_commit_sha":null,"homepage":"","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/smartcontractkit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-17T01:15:22.000Z","updated_at":"2025-04-23T10:21:51.000Z","dependencies_parsed_at":"2024-01-14T06:04:16.625Z","dependency_job_id":"49e72e39-e47b-4b31-9519-854fd8accbe6","html_url":"https://github.com/smartcontractkit/full-blockchain-solidity-course-js","commit_stats":{"total_commits":126,"total_committers":29,"mean_commits":4.344827586206897,"dds":0.3492063492063492,"last_synced_commit":"3e1b1d8bc558df64d19fd31ac363089a2e5d69ff"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartcontractkit%2Ffull-blockchain-solidity-course-js","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartcontractkit%2Ffull-blockchain-solidity-course-js/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartcontractkit%2Ffull-blockchain-solidity-course-js/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/smartcontractkit%2Ffull-blockchain-solidity-course-js/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/smartcontractkit","download_url":"https://codeload.github.com/smartcontractkit/full-blockchain-solidity-course-js/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253969266,"owners_count":21992264,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alchemy","blockchain","chainlink","dao","defi","eth-security-toolbox","ethereum","hardhat","ipfs","javascript","moralis","nextjs","nft","openzeppelin","reactjs","remix","smart-contracts","solidity","thegraphprotocol","typescript"],"created_at":"2024-07-31T10:00:42.413Z","updated_at":"2025-05-13T15:13:13.453Z","avatar_url":"https://github.com/smartcontractkit.png","language":null,"funding_links":[],"categories":["Others","GitHub Repositories","语言资源库","区块链、智能合约","Web 3.0","📦 Legacy \u0026 Inactive Projects"],"sub_categories":["books","网络服务_其他"],"readme":"# Update: Head to Cyfrin Updraft\n\n\u003e **ℹ️ Important:**\n\u003e This repo is no longer actively maintained as there have been changes in Hardhat tooling. The video is out of sync with the code, and you can still follow along with the video, but you will likely need to troubleshoot the changes in the tooling and dependencies. Note also that best practices have evolved since this video was made.  \n\u003e If you'd like to continue your training with more up-to-date material, you can take a look at [Cyfrin Updraft](https://updraft.cyfrin.io/). That content is developed with love by Patrick \u0026 Cyfrin \u003c3. However note that Cyfrin Updraft training uses Foundry, not Hardhat, so there will be tooling changes involved.\n\n# Web3, Full Stack Solidity, Smart Contract \u0026 Blockchain - Beginner to Expert ULTIMATE Course | Javascript Edition\n\n\u003cbr/\u003e\n\u003cp align=\"center\"\u003e\n\u003ca href=\"https://www.youtube.com/watch?v=gyMwXuJrbJQ\" target=\"_blank\"\u003e\n\u003cimg src=\"./img/blockchain1.png\" width=\"500\" alt=\"Solidity, Blockchain, and Smart Contract Course – Beginner to Expert Javascript Tutorial\"\u003e\n\u003c/a\u003e\n\u003c/p\u003e\n\u003cbr/\u003e\n\nWelcome to the repository for the Ultimate Web3, Full Stack Solidity, and Smart Contract - Beginner to Expert Full Course | Javascript Edition FreeCodeCamp Course!\n\n# Link to video: https://www.youtube.com/watch?v=gyMwXuJrbJQ\n\nAll code references have both a javascript and a typescript edition.\n\nRecommended Testnet: Sepolia\n\n_We have updated the repos to work with Sepolia due to Rinkeby and Kovan being sunset, and Goerli being a disaster. Let us know if any of the changes break stuff!_\n\n# [Testnet Faucets](https://faucets.chain.link)\n\nMain Faucet:\u003ca href=\"https://faucets.chain.link\" target=\"_blank\"\u003e https://faucets.chain.link\u003c/a\u003e\nBackup Faucet:\u003ca href=\"https://sepoliafaucet.com/\" target=\"_blank\"\u003e https://sepoliafaucet.com/\u003c/a\u003e\n\n\u003e ⚠️ All code associated with this course is for demo purposes only. They have not been audited and should not be considered production ready. Please use at your own risk.\n\n# Resources For This Course\n\n### Questions\n\n- [Github Discussions](https://github.com/smartcontractkit/full-blockchain-solidity-course-js/discussions)\n  - Ask questions and chat about the course here!\n- [Stack Exchange Ethereum](https://ethereum.stackexchange.com/)\n  - Great place for asking technical questions about Ethereum\n- [StackOverflow](https://stackoverflow.com/)\n  - Great place for asking technical questions overall\n\n# Table of Contents\n\n\u003cdetails\u003e\n\u003csummary\u003eResources\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#testnet-faucets\"\u003eTestnet Faucets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#resources-for-this-course\"\u003eResources For This Course\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#questions\"\u003eQuestions\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#table-of-contents\"\u003eTable of Contents\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e \u003ca href=\"#lesson-0-the-edge-of-the-rabbit-hole\"\u003eLesson 0: The Edge of the Rabbit Hole\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n  \u003cli\u003e\n  \u003ca href=\"#welcome-to-the-course\"\u003eWelcome to the course! \u003c/a\u003e\n  \u003c/li\u003e\n  \u003cli\u003e\n  \u003ca href=\"#best-practices\"\u003eBest Practices \u003c/a\u003e\n  \u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e \u003ca href=\"#lesson-1-blockchain-basics\"\u003e Lesson 1: Blockchain Basics \u003c/a\u003e \u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003ca href=\"#what-is-a-blockchain-what-does-a-blockchain-do\"\u003eWhat is a Blockchain? What does a blockchain do?\u003c/a\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#the-purpose-of-smart-contracts\"\u003eThe Purpose Of Smart Contracts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#other-blockchain-benefits\"\u003eOther Blockchain Benefits\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-have-smart-contracts-done-so-far\"\u003eWhat have Smart Contracts done so far?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#making-your-first-transaction\"\u003eMaking Your First Transaction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gas-i-introduction-to-gas\"\u003eGas I: Introduction to Gas\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-do-blockchains-work\"\u003eHow Do Blockchains Work?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#signing-transactions\"\u003eSigning Transactions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gas-ii\"\u003eGas II\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#high-level-blockchain-fundamentals\"\u003eHigh-Level Blockchain Fundamentals\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-2-welcome-to-remix-simple-storage\"\u003eLesson 2: Welcome to Remix! Simple Storage\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#setting-up-your-first-contract\"\u003eSetting Up Your First Contract\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-types\"\u003eBasic Solidity: Types\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-functions\"\u003eBasic Solidity: Functions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-arrays--structs\"\u003eBasic Solidity: Arrays \u0026amp; Structs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-compiler-errors-and-warnings\"\u003eBasic Solidity: Compiler Errors and Warnings\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#memory-storage-calldata-intro\"\u003eMemory, Storage, Calldata (Intro)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#mappings\"\u003eMappings\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying-your-first-contract\"\u003eDeploying your First Contract\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#the-evm--a-recap-of-lesson-2\"\u003eThe EVM \u0026amp; A Recap of Lesson 2\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-3-remix-storage-factory\"\u003eLesson 3: Remix Storage Factory\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-1\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-importing-contracts-into-other-contracts\"\u003eBasic Solidity: Importing Contracts into other Contracts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-interacting-with-other-contracts\"\u003eBasic Solidity: Interacting with other Contracts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-inheritance--overrides\"\u003eBasic Solidity: Inheritance \u0026amp; Overrides\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-3-recap\"\u003eLesson 3 Recap\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-4-remix-fund-me\"\u003eLesson 4: Remix Fund Me\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-2\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sending-eth-through-a-function--reverts\"\u003eSending ETH Through a Function \u0026amp; Reverts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#chainlink--oracles\"\u003eChainlink \u0026amp; Oracles\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#review-of-sending-eth-and-working-with-chainlink\"\u003eReview of Sending ETH and working with Chainlink\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#interfaces--price-feeds\"\u003eInterfaces \u0026amp; Price Feeds\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#importing-from-github--npm\"\u003eImporting from GitHub \u0026amp; NPM\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#floating-point-math-in-solidtiy\"\u003eFloating Point Math in Solidity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-arrays--structs-ii\"\u003eBasic Solidity: Arrays \u0026amp; Structs II\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#review-of-interfacs-importing-from-github--math-in-solidity\"\u003eReview of Interfacs, Importing from GitHub, \u0026amp; Math in Solidity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#libraries\"\u003eLibraries\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#safemath-overflow-checking-and-the-unchecked-keywork\"\u003eSafeMath, Overflow Checking, and the \u0026quot;unchecked\u0026quot; keywork\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-for-loop\"\u003eBasic Solidity: For Loop\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-resetting-an-array\"\u003eBasic Solidity: Resetting an Array\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sending-eth-from-a-contract\"\u003eSending ETH from a Contract\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-constructor\"\u003eBasic Solidity: Constructor\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-solidity-modifiers\"\u003eBasic Solidity: Modifiers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#testnet-demo\"\u003eTestnet Demo\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#advanced-solidity\"\u003eAdvanced Solidity\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#immutable--constant\"\u003eImmutable \u0026amp; Constant\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-errors\"\u003eCustom Errors\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#receive--fallback-functions\"\u003eReceive \u0026amp; Fallback Functions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-4-recap\"\u003eLesson 4 Recap\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-5-ethersjs-simple-storage\"\u003eLesson 5: Ethers.js Simple Storage\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#effective-debugging-strategies--getting-help\"\u003eEffective Debugging Strategies \u0026amp; Getting Help\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#how-to-debug-anything-video\"\u003eHow to Debug Anything Video\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#installation--setup\"\u003eInstallation \u0026amp; Setup\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#mac--linux-setup\"\u003eMac \u0026amp; Linux Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#windows-setup\"\u003eWindows Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gitpod\"\u003eGitpod\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#local-development-introduction\"\u003eLocal Development Introduction\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#optional-javascript-crash-courses\"\u003eOptional Javascript Crash Courses\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#tiny-javascript-refresher\"\u003eTiny Javascript Refresher\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#asynchronous-programming-in-javascript\"\u003eAsynchronous Programming in Javascript\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#compiling-our-solidity\"\u003eCompiling our Solidity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#ganache--networks\"\u003eGanache \u0026amp; Networks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-ethersjs\"\u003eIntroduction to Ethers.js\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#a-note-on-the-await-keyword\"\u003eA Note on the await Keyword\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#adding-transaction-overrides\"\u003eAdding Transaction Overrides\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#transaction-receipts\"\u003eTransaction Receipts\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sending-a-raw-transaction-in-ethersjs\"\u003eSending a \u0026quot;raw\u0026quot; Transaction in Ethersjs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#interacting-with-contracts-in-ethersjs\"\u003eInteracting with Contracts in Ethersjs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#environment-variables\"\u003eEnvironment Variables\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#better-private-key-management\"\u003eBetter Private Key Management\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#optional-prettier-formatting\"\u003eOptional Prettier Formatting\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying-to-a-testnet-or-a-mainnet\"\u003eDeploying to a Testnet or a Mainnet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#verifying-on-block-explorers-from-the-ui\"\u003eVerifying on Block Explorers from the UI\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#alchemy-dashboard--the-mempool\"\u003eAlchemy Dashboard \u0026amp; The Mempool\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-5-recap\"\u003eLesson 5 Recap\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#typescript-ethers-simple-storage\"\u003eTypescript Ethers Simple Storage\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-6-hardhat-simple-storage\"\u003eLesson 6: Hardhat Simple Storage\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-3\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup\"\u003eHardhat Setup\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#troubleshooting-hardaht-setup\"\u003eTroubleshooting Hardaht Setup\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup-continued\"\u003eHardhat Setup Continued\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying-simplestorage-from-hardhat\"\u003eDeploying SimpleStorage from Hardhat\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#networks-in-hardhat\"\u003eNetworks in Hardhat\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#programatic-verification\"\u003eProgramatic Verification\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#interacting-with-contracts-in-hardhat\"\u003eInteracting with Contracts in Hardhat\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#artifacts-troubleshooting\"\u003eArtifacts Troubleshooting\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#custom-hardhat-tasks\"\u003eCustom Hardhat Tasks\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-localhost-node\"\u003eHardhat Localhost Node\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#the-hardhat-console\"\u003eThe Hardhat Console\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-tests\"\u003eHardhat Tests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-gas-reporter\"\u003eHardhat Gas Reporter\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#solidity-coverage\"\u003eSolidity Coverage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-waffle\"\u003eHardhat Waffle\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-6-recap\"\u003eLesson 6 Recap\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#typescript-hardhat-simple-storage\"\u003eTypescript Hardhat Simple Storage\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-7-hardhat-fund-me\"\u003eLesson 7: Hardhat Fund Me\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-4\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup---fund-me\"\u003eHardhat Setup - Fund Me\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#linting\"\u003eLinting\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup---fund-me---continued\"\u003eHardhat Setup - Fund Me - Continued\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#importing-from-npm\"\u003eImporting from NPM\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-deploy\"\u003eHardhat Deploy\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#mocking\"\u003eMocking\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#utils-folder\"\u003eUtils Folder\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#testnet-demo---hardhat-fund-me\"\u003eTestnet Demo - Hardhat Fund Me\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#solidity-style-guide\"\u003eSolidity Style Guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#testing-fund-me\"\u003eTesting Fund Me\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#breakpoints--debugging\"\u003eBreakpoints \u0026amp; Debugging\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gas-iii\"\u003eGas III:\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#consolelog--debugging\"\u003econsole.log \u0026amp; Debugging\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#testing-fund-me-ii\"\u003eTesting Fund Me II\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#storage-in-solidity\"\u003eStorage in Solidity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#gas-optimizations-using-storage-knowledge\"\u003eGas Optimizations using Storage Knowledge\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#solidity-chainlink-style-guide\"\u003eSolidity Chainlink Style Guide\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#storage-review\"\u003eStorage Review\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#staging-tests\"\u003eStaging Tests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#running-scripts-on-a-local-node\"\u003eRunning Scripts on a Local Node\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#adding-scripts-to-your-packagejson\"\u003eAdding Scripts to your package.json\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#pushing-to-github\"\u003ePushing to GitHub\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#-tweet-me-add-your-repo-in\"\u003e🐸🐦 Tweet Me (add your repo in)!\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-8-html--javascript-fund-me-full-stack--front-end\"\u003eLesson 8: HTML / Javascript Fund Me (Full Stack / Front End)\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-5\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-websites-work-with-web3-wallets\"\u003eHow Websites work with Web3 Wallets\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#html-setup\"\u003eHTML Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#connecting-html-to-metamask\"\u003eConnecting HTML to Metamask\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#javascript-in-its-own-file\"\u003eJavascript in it\u0026#39;s own file\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#es6-vs-nodejs\"\u003eES6 vs Nodejs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#sending-a-transaction-from-a-website\"\u003eSending a transaction from a Website\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#resetting-an-account-in-metamask\"\u003eResetting an Account in Metamask\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#listening-for-events-and-completed-transactions\"\u003eListening for Events and Completed Transactions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#input-forms\"\u003eInput Forms\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#reading-from-the-blockchain\"\u003eReading from the Blockchain\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#withdraw-function\"\u003eWithdraw Function\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-8-recap\"\u003eLesson 8 Recap\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#optional-links\"\u003eOptional Links\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-9-hardhat-smart-contract-lottery\"\u003eLesson 9: Hardhat Smart Contract Lottery\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-6\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup---smart-contract-lottery\"\u003eHardhat Setup - Smart Contract Lottery\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rafflesol-setup\"\u003eRaffle.sol Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-events\"\u003eIntroduction to Events\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#events-in-rafflesol\"\u003eEvents in Raffle.sol\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-chainlink-vrf\"\u003eIntroduction to Chainlink VRF\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#sub-lesson-chainlink-vrf\"\u003eSub-Lesson: Chainlink VRF\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#implementing-chainlink-vrf---introduction\"\u003eImplementing Chainlink VRF - Introduction\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-shorthand\"\u003eHardhat Shorthand\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#implementing-chainlink-vrf---the-request\"\u003eImplementing Chainlink VRF - The Request\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#implementing-chainlink-vrf---the-fulfill\"\u003eImplementing Chainlink VRF - The FulFill\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#modulo\"\u003eModulo\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-chainlink-keepers\"\u003eIntroduction to Chainlink Keepers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#implementing-chainlink-keepers---checkupkeep\"\u003eImplementing Chainlink Keepers - checkUpkeep\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#enums\"\u003eEnums\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#implementing-chainlink-keepers---checkupkeep-continued\"\u003eImplementing Chainlink Keepers - checkUpkeep continued\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#implementing-chainlink-keepers---performupkeep\"\u003eImplementing Chainlink Keepers - performUpkeep\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#code-cleanup\"\u003eCode Cleanup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying-rafflesol\"\u003eDeploying Raffle.sol\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#mock-chainlink-vrf-coordinator\"\u003eMock Chainlink VRF Coordinator\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#continued\"\u003eContinued\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rafflesol-unit-tests\"\u003eRaffle.sol Unit Tests\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#testing-events--chai-matchers\"\u003eTesting Events \u0026amp; Chai Matchers\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#continued-i\"\u003eContinued I\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-methods--time-travel\"\u003eHardhat Methods \u0026amp; Time Travel\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#continued-ii\"\u003eContinued II\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#callstatic\"\u003eCallstatic\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#continued-iii\"\u003eContinued III\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#massive-promise-test\"\u003eMassive Promise Test\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#continued-iv\"\u003eContinued IV\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rafflesol-staging-tests\"\u003eRaffle.sol Staging Tests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#testing-on-a-testnet\"\u003eTesting on a Testnet\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#recommended-link-amounts-for-sepolia-staging-test\"\u003eRecommended LINK amounts for Sepolia Staging Test:\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#conclusion\"\u003eConclusion\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#typescript---smart-contract-lottery\"\u003eTypescript - Smart Contract Lottery\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-10-nextjs-smart-contract-lottery-full-stack--front-end\"\u003eLesson 10: NextJS Smart Contract Lottery (Full Stack / Front End)\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-7\"\u003eIntroduction\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#optional-sub-lesson-full-stack-development--other-libraries\"\u003eOptional Sub-Lesson: Full Stack Development \u0026amp; Other Libraries\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nextjs-setup\"\u003eNextJS Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#manual-header-i\"\u003eManual Header I\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#react-hooks\"\u003eReact Hooks\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#manual-header-ii\"\u003eManual Header II\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#useeffect-hook\"\u003euseEffect Hook\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#local-storage\"\u003eLocal Storage\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#isweb3enabledloading\"\u003eisWeb3EnabledLoading\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#web3uikit\"\u003eweb3uikit\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-calling-functions-in-nextjs\"\u003eIntroduction to Calling Functions in Nextjs\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#automatic-constant-value-ui-updater\"\u003eAutomatic Constant Value UI Updater\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#runcontractfunction\"\u003erunContractFunction\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#usestate\"\u003euseState\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#calling-functions-in-nextjs\"\u003eCalling Functions in NextJS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#usenotification\"\u003euseNotification\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#reading--displaying-contract-data\"\u003eReading \u0026amp; Displaying Contract Data\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#a-note-about-onsuccess\"\u003eA Note about \u003ccode\u003eonSuccess\u003c/code\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#a-challenge-to-you\"\u003eA Challenge to You\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#tailwind--styling\"\u003eTailwind \u0026amp; Styling\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-hosting-your-site\"\u003eIntroduction to Hosting your Site\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#ipfs\"\u003eIPFS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hosting-on-ipfs\"\u003eHosting on IPFS\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hosting-on-ipfs--filecoin-using-fleek\"\u003eHosting on IPFS \u0026amp; Filecoin using Fleek\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#filecoin-overview\"\u003eFilecoin Overview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-10-recap\"\u003eLesson 10 Recap\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-11-hardhat-starter-kit\"\u003eLesson 11: Hardhat Starter Kit\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-12-hardhat-erc20s\"\u003eLesson 12: Hardhat ERC20s\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#what-is-an-erc-what-is-an-eip\"\u003eWhat is an ERC? What is an EIP?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-is-an-erc20\"\u003eWhat is an ERC20?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#manually-creating-an-erc20-token\"\u003eManually Creating an ERC20 Token\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#creating-an-erc20-token-with-openzeppelin\"\u003eCreating an ERC20 Token with Openzeppelin\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-12-recap\"\u003eLesson 12 Recap\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-13-hardhat-defi--aave\"\u003eLesson 13: Hardhat DeFi \u0026amp; Aave\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#what-is-defi\"\u003eWhat is DeFi?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-is-aave\"\u003eWhat is Aave?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#programatic-borrowing--lending\"\u003eProgramatic Borrowing \u0026amp; Lending\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#weth---wrapped-eth\"\u003eWETH - Wrapped ETH\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#forking-mainnet\"\u003eForking Mainnet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#depositing-into-aave\"\u003eDepositing into Aave\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#borrowing-from-aave\"\u003eBorrowing from Aave\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#repaying-with-aave\"\u003eRepaying with Aave\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#visualizing-the-transactions\"\u003eVisualizing the Transactions\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-13-recap\"\u003eLesson 13 Recap\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#happy-bow-tie-friday-with-austin-griffith\"\u003eHappy Bow-Tie Friday with Austin Griffith\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#more-defi-learnings\"\u003eMore DeFi Learnings:\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-14-hardhat-nfts-everything-you-need-to-know-about-nfts\"\u003eLesson 14: Hardhat NFTs (EVERYTHING you need to know about NFTs)\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#what-is-an-nft\"\u003eWhat is an NFT?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#code-overview\"\u003eCode Overview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup-1\"\u003eHardhat Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#basic-nft\"\u003eBasic NFT\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#write-tests\"\u003eWrite Tests\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#random-ipfs-nft\"\u003eRandom IPFS NFT\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#mapping-chainlink-vrf-requests\"\u003eMapping Chainlink VRF Requests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#creating-rare-nfts\"\u003eCreating Rare NFTs\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#setting-the-nft-image\"\u003eSetting the NFT Image\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#setting-an-nft-mint-price\"\u003eSetting an NFT Mint Price\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploy-script\"\u003eDeploy Script\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#uploading-token-images-with-pinata\"\u003eUploading Token Images with Pinata\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#uploading-token-uris-metadata-with-pinata\"\u003eUploading Token URIs (metadata) with Pinata\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying\"\u003eDeploying\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#tests\"\u003eTests\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#dynamic-svg-on-chain-nft\"\u003eDynamic SVG On-Chain NFT\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#what-is-an-svg\"\u003eWhat is an SVG?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#initial-code\"\u003eInitial Code\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#base64-encoding\"\u003eBase64 Encoding\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#advanced-evm-opcodes-encoding-and-calling\"\u003eAdvanced: EVM Opcodes, Encoding, and Calling\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#abiencode--abiencodepacked\"\u003eabi.encode \u0026amp; abi.encodePacked\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-encoding-function-calls-directly\"\u003eIntroduction to Encoding Function Calls Directly\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-encoding-function-calls-recap\"\u003eIntroduction to Encoding Function Calls Recap\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#encoding-function-calls-directly\"\u003eEncoding Function Calls Directly\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#creating-an-nft-tokenuri-on-chain\"\u003eCreating an NFT TokenURI on-Chain\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#making-the-nft-dynamic\"\u003eMaking the NFT Dynamic\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploy-script-1\"\u003eDeploy Script\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying-the-nfts-to-a-testnet\"\u003eDeploying the NFTs to a Testnet\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#lesson-14-recap\"\u003eLesson 14 Recap\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-15-nextjs-nft-marketplace-if-you-finish-this-lesson-you-are-a-full-stack-monster\"\u003eLesson 15: NextJS NFT Marketplace (If you finish this lesson, you are a full-stack MONSTER!)\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-8\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#part-i-nft-marketplace-contracts\"\u003ePart I: NFT Marketplace Contracts\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#hardhat-setup-2\"\u003eHardhat Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nftmarketplacesol\"\u003eNftMarketplace.sol\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#reentrancy\"\u003eReentrancy\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#nftmarketplacesol---continued\"\u003eNftMarketplace.sol - Continued\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nftmarketplacesol---deploy-script\"\u003eNftMarketplace.sol - Deploy Script\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nftmarketplacesol---tests\"\u003eNftMarketplace.sol - Tests\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nftmarketplacesol---scripts\"\u003eNftMarketplace.sol - Scripts\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#part-ii-moralis-front-end\"\u003ePart II: Moralis Front End\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#what-is-moralis\"\u003eWhat is Moralis?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#nextjs-setup-1\"\u003eNextJS Setup\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#adding-tailwind\"\u003eAdding Tailwind\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#introduction-to-indexing-in-web3\"\u003eIntroduction to Indexing in Web3\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#connecting-moralis-to-our-local-hardhat-node\"\u003eConnecting Moralis to our Local Hardhat Node\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#moralis-event-sync\"\u003eMoralis Event Sync\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#reset-local-chain\"\u003eReset Local Chain\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#moralis-cloud-functions\"\u003eMoralis Cloud Functions\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#practice-resetting-the-local-chain\"\u003ePractice Resetting the Local Chain\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#moralis-cloud-functions-ii\"\u003eMoralis Cloud Functions II\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#querying-the-moralis-database\"\u003eQuerying the Moralis Database\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#rendering-the-nft-images\"\u003eRendering the NFT Images\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#update-listing-modal\"\u003eUpdate Listing Modal\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#buy-nft-listing\"\u003eBuy NFT Listing\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#listing-nfts-for-sale\"\u003eListing NFTs for Sale\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#part-iii-thegraph-front-end\"\u003ePart III: TheGraph Front End\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#introduction-9\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-is-the-graph\"\u003eWhat is The Graph?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#building-a-subgraph\"\u003eBuilding a Subgraph\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#deploying-our-subgraph\"\u003eDeploying our Subgraph\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#reading-from-the-graph\"\u003eReading from The Graph\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hosting-our-dapp\"\u003eHosting our Dapp\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-16-hardhat-upgrades\"\u003eLesson 16: Hardhat Upgrades\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#upgradeable-smart-contracts-overview\"\u003eUpgradeable Smart Contracts Overview\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#types-of-upgrades\"\u003eTypes of Upgrades\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#delegatecall\"\u003eDelegatecall\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#small-proxy-example\"\u003eSmall Proxy Example\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#transparent-upgradeable-smart-contract\"\u003eTransparent Upgradeable Smart Contract\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-17-hardhat-daos\"\u003eLesson 17: Hardhat DAOs\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-10\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#what-is-a-dao\"\u003eWhat is a DAO?\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#how-to-build-a-dao\"\u003eHow to build a DAO\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003e\u003ca href=\"#lesson-18-security--auditing\"\u003eLesson 18: Security \u0026amp; Auditing\u003c/a\u003e\u003c/summary\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"#introduction-11\"\u003eIntroduction\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#slither\"\u003eSlither\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#fuzzing-and-eth-security-toolbox\"\u003eFuzzing and Eth Security Toolbox\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#closing-thoughts\"\u003eClosing Thoughts\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003c/details\u003e\n\u003cdetails\u003e\n\u003csummary\u003eMore Resources\u003c/summary\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#congratulations\"\u003eCongratulations\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#where-do-i-go-now\"\u003eWhere do I go now?\u003c/a\u003e\u003cul\u003e\n\u003cli\u003e\u003ca href=\"#learning-more\"\u003eLearning More\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#community\"\u003eCommunity\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"#hackathons\"\u003eHackathons\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/ul\u003e\n\u003c/details\u003e\n\n# Lesson 0: The Edge of the Rabbit Hole\n\n## Welcome to the course!\n\n_[⌨️ (00:00:00) Lesson 0: Welcome To Blockchain](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=0s)_\n\n## Best Practices\n\n- **Follow the repository:** While going through the course be 100% certain to follow along with the github repository. If you run into in an issue check the chronological-updates in the repo.\n- **Be Active in the community:** Ask questions and engage with other developers going through the course in the discussions tab, be sure to go and say hello or gm! This space is different from the other industries, you don't have to be secretive; communicate, network and learn with others :)\n- **Learn at your own pace:** It doesn't matter if it takes you a day, a week, a month or even a year. Progress \u003e\u003e\u003e Perfection\n- **Take Breaks:** You will exhaust your mind and recall less if you go all out and watch the entire course in one sitting.\n  **Suggested Strategy** every 25 minutes take a 5 min break, and every 2 hours take a longer 30 min break\n- **Refer to Documentation:** Things are constantly being updated, so whenever Patrick opens up some documentation, open it your end and maybe even have the code sample next to you.\n\n# Lesson 1: Blockchain Basics\n\n_[⌨️ (00:09:05) Lesson 1: Blockchain Basics](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=545s)_\n\n## What is a Blockchain? What does a blockchain do?\n\n- [Bitcoin Whitepaper](https://bitcoin.org/bitcoin.pdf)\n  - [Satoshi Nakamoto](https://en.wikipedia.org/wiki/Satoshi_Nakamoto)\n- [Ethereum Whitepaper](https://ethereum.org/en/whitepaper/)\n  - [Vitalik Buterin](https://en.wikipedia.org/wiki/Vitalik_Buterin)\n- [What is a Smart Contract?](https://chain.link/education/smart-contracts)\n- [Nick Szabo](https://en.wikipedia.org/wiki/Nick_Szabo)\n- [Hybrid Smart Contracts](https://blog.chain.link/hybrid-smart-contracts-explained/)\n- [Blockchain Oracles](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72?source=friends_link\u0026sk=d921a38466df8a9176ed8dd767d8c77d)\n- [Terminology](https://connect.comptia.org/content/articles/blockchain-terminology)\n- [Web3](https://en.wikipedia.org/wiki/Web3)\n- [What is a blockchain](https://www.investopedia.com/terms/b/blockchain.asp)\n\n## The Purpose Of Smart Contracts\n\n_[⌨️ (00:18:27) The Purpose of Smart Contracts](https://youtu.be/gyMwXuJrbJQ?t=1107)_\n\n- 🎥 [Original Video](https://www.youtube.com/watch?v=_JeRq7Gwj5Y\u0026feature=youtu.be)\n- 🦬 [My ETH Denver Talk](https://www.youtube.com/watch?v=06hXCX_jj2E)\n- 🍔 [McDonalds Scandal](https://www.chicagotribune.com/sns-mcdonalds-story.html)\n- ⛓ [More on the evolution of agreements](https://www.youtube.com/watch?v=ufVyX7JDCgg)\n- ✍️ [What is a Smart Contract?](https://www.youtube.com/watch?v=ZE2HxTmxfrI)\n- 🧱 [How does a blockchain work?](https://www.youtube.com/watch?v=SSo_EIwHSd4)\n- 🔮 [Chainlink \u0026 Oracles](https://www.youtube.com/watch?v=tIUHQ7sDoaU)\n\n## Other Blockchain Benefits\n\n_[⌨️ (00:30:41) Other Blockchain Benefits](https://youtu.be/gyMwXuJrbJQ?t=1841)_\n\n- Decentralized\n- Transparency \u0026 Flexibility\n- Speed \u0026 Efficiency\n- Security \u0026 Immutability\n- Counterparty Risk Removal\n- Trust Minimized Agreements\n\n## What have Smart Contracts done so far?\n\n_[⌨️ (00:36:36) What have Smart Contracts done so far?](https://youtu.be/gyMwXuJrbJQ?t=2196)_\n\n- [DeFi](https://chain.link/education/defi)\n  - [Defi Llama](https://defillama.com/)\n  - [Why DeFi is Important](https://medium.com/the-capital/why-defi-1519cc4d4bd3)\n- [DAOs](https://betterprogramming.pub/what-is-a-dao-what-is-the-architecture-of-a-dao-how-to-build-a-dao-high-level-d096a97162cc)\n- [NFTs](https://www.youtube.com/watch?v=9yuHz6g_P50)\n\n## Making Your First Transaction\n\n_[⌨️ (00:39:17) Making Your First Transaction](https://youtu.be/gyMwXuJrbJQ?t=2357)_\n\n- [Metamask Download Link](https://metamask.io/)\n  - [What is a Private Key?](https://www.coinbase.com/learn/crypto-basics/what-is-a-private-key)\n  - [What is a Secret Phrase?](https://metamask.zendesk.com/hc/en-us/articles/360060826432-What-is-a-Secret-Recovery-Phrase-and-how-to-keep-your-crypto-wallet-secure)\n- [Etherscan](https://etherscan.io/)\n- [Sepolia Etherscan](https://sepolia.etherscan.io/)\n- Sepolia Faucet (Check the [link token contracts page](https://docs.chain.link/docs/link-token-contracts/#sepolia))\n  - NOTE: The Chainlink documentation always has the most up to date faucets on their [link token contracts page](https://docs.chain.link/docs/link-token-contracts/#sepolia). If the faucet above is broken, check the chainlink documentation for the most up to date faucet.\n- OR, use the [Sepolia ETH Faucet](https://faucets.chain.link/), just be sure to swap your metamask to Sepolia!\n\n## Gas I: Introduction to Gas\n\n_[⌨️ (00:58:59) Gas I: Introduction to Gas](https://youtu.be/gyMwXuJrbJQ?t=3539)_\n\n- [Gas and Gas Fees](https://ethereum.org/en/developers/docs/gas/)\n- [Wei, Gwei, and Ether Converter](https://eth-converter.com/)\n- [ETH Gas Station](https://ethgasstation.info/)\n\n## How Do Blockchains Work?\n\n_[⌨️ (01:05:32) How Do Blockchains Work](https://youtu.be/gyMwXuJrbJQ?t=3932)_\n\n- [What is a hash?](https://techjury.net/blog/what-is-cryptographic-hash/)\n- [Blockchain Demo](https://andersbrownworth.com/blockchain/)\n- [Summary](https://ethereum.org/en/developers/docs/intro-to-ethereum/)\n\n## Signing Transactions\n\n_[⌨️ (01:22:55) Signing Transactions](https://youtu.be/gyMwXuJrbJQ?t=4975)_\n\n- [Public / Private Keys](https://andersbrownworth.com/blockchain/public-private-keys/keys)\n- [Layer 2 and Rollups](https://ethereum.org/en/developers/docs/scaling/layer-2-rollups/)\n- [Decentralized Blockchain Oracles](https://blog.chain.link/what-is-the-blockchain-oracle-problem/)\n\n## Gas II\n\n_[⌨️ (01:30:22) Gas II: Block Rewards \u0026 EIP 1559](https://youtu.be/gyMwXuJrbJQ?t=5422)_\n\n- [Block Rewards](https://www.investopedia.com/terms/b/block-reward.asp)\n- Advanced Gas\n  - [EIP 1559](https://www.youtube.com/watch?v=MGemhK9t44Q)\n  - GWEI, WEI, and ETH\n    - [ETH Converter](https://eth-converter.com/)\n\n## Gas II Summary\n\n_[⌨️ (01:36:44) Gas II Summary](https://youtu.be/gyMwXuJrbJQ?t=5804)_\n\n- [Run Your Own Ethereum Node](https://geth.ethereum.org/docs/getting-started)\n\n## High-Level Blockchain Fundamentals\n\n_[⌨️ (01:39:32) High-Level Blockchain Fundamentals]https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=5972s()_\n\n- [Consensus](https://wiki.polkadot.network/docs/learn-consensus)\n- [Proof of Stake](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/)\n- [Proof of Work](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/)\n- [Nakamoto Consensus](https://blockonomi.com/nakamoto-consensus/)\n- [Ethereum 2 (the merge)](https://ethereum.org/en/eth2/)\n\n🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed Blockchain Basics! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊\n\n# Lesson 2: [Welcome to Remix! Simple Storage](https://github.com/PatrickAlphaC/simple-storage-fcc)\n\n_[⌨️ (02:01:16) Lesson 2: Welcome to Remix! Simple Storage](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=7276s)_\n\n💻 Code: https://github.com/PatrickAlphaC/simple-storage-fcc\n\n## Introduction\n\n_[⌨️ (02:03:05) Introduction](https://youtu.be/gyMwXuJrbJQ?t=7385)_\n\n- [Remix](https://remix.ethereum.org/)\n- [Solidity Documentation](https://docs.soliditylang.org/en/latest/index.html)\n\n## Setting Up Your First Contract\n\n_[⌨️ (02:05:18) Setting Up Your First Contract](https://youtu.be/gyMwXuJrbJQ?t=7518)_\n\n- Versioning\n- Take notes in your code!\n- [What is a software license](https://snyk.io/learn/what-is-a-software-license/)\n- SPDX License\n- Compiling\n- Contract Declaration\n\n## Basic Solidity: Types\n\n_[⌨️ (02:12:28) Basic Solidity Types](https://youtu.be/gyMwXuJrbJQ?t=7948)_\n\n- [Types \u0026 Declaring Variables](https://docs.soliditylang.org/en/v0.8.13/)\n  - `uint256`, `int256`, `bool`, `string`, `address`, `bytes32`\n  - [Solidity Types](https://docs.soliditylang.org/en/latest/types.html)\n  - [Bits and Bytes](https://www.youtube.com/watch?v=Dnd28lQHquU)\n- Default Initializations\n- Comments\n\n## Basic Solidity: Functions\n\n_[⌨️ (02:18:40) Basic Solidity Functions](https://youtu.be/gyMwXuJrbJQ?t=8320)_\n\n- Functions\n- Deploying a Contract\n  - Smart Contracts have addresses just like our wallets\n- Calling a public state-changing Function\n- [Visibility](https://docs.soliditylang.org/en/latest/contracts.html#visibility-and-getters)\n- Gas III | An example\n- Scope\n- View \u0026 Pure Functions\n\n## Basic Solidity: Arrays \u0026 Structs\n\n_[⌨️ (02:35:30) Basic Solidity Arrays \u0026 Structs](https://youtu.be/gyMwXuJrbJQ?t=9331)_\n\n- Structs\n- Intro to Storage\n- Arrays\n- Dynamic \u0026 Fixed Sized\n- `push` array function\n\n## Basic Solidity: Compiler Errors and Warnings\n\n_[⌨️ (02:45:35) Basic Solidity Errors \u0026 Warnings](https://youtu.be/gyMwXuJrbJQ?t=9935)_\n\n- Yellow: Warnings are Ok\n- Red: Errors are not Ok\n\n## Memory, Storage, Calldata (Intro)\n\n_[⌨️ (02:46:34) Basic Solidity Memory, Storage, \u0026 Calldata (Intro)](https://youtu.be/gyMwXuJrbJQ?t=9994)_\n\n- 6 Places you can store and access data\n  - calldata\n  - memory\n  - storage\n  - code\n  - logs\n  - stack\n\n## Mappings\n\n_[⌨️ (02:50:17) Basic Solidity Mappings](https://youtu.be/gyMwXuJrbJQ?t=10217)_\n\n- [Mappings](https://solidity-by-example.org/mapping)\n\n## Deploying your First Contract\n\n_[⌨️ (02:53:38) Deploying your First Contract](https://youtu.be/gyMwXuJrbJQ?t=10418)_\n\n- A testnet or mainnet\n- Connecting Metamask\n- [Find a faucet here](https://docs.chain.link/docs/link-token-contracts/#Sepolia)\n- See the faucets at the top of this readme!\n- Interacting with Deployed Contracts\n\n## The EVM \u0026 A Recap of Lesson 2\n\n_[⌨️ (03:03:07) The EVM \u0026 A Recap of Lesson 2](https://youtu.be/gyMwXuJrbJQ?t=10987)_\n\n- The EVM\n\n# Lesson 3: Remix Storage Factory\n\n_[⌨️ (03:05:34) Lesson 3: Remix Storage Factory](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=11134s)_\n\n💻 Code: https://github.com/PatrickAlphaC/storage-factory-fcc\n\n## Introduction\n\n_[⌨️ (03:06:06) Introduction](https://youtu.be/gyMwXuJrbJQ?t=11166)_\n\n- [Factory Pattern](https://betterprogramming.pub/learn-solidity-the-factory-pattern-75d11c3e7d29)\n\n## Basic Solidity: Importing Contracts into other Contracts\n\n_[⌨️ (03:07:29) Importing Contracts into other Contracts](https://youtu.be/gyMwXuJrbJQ?t=11249)_\n\n- [Composibility](https://chain.link/techtalks/defi-composability)\n- [Solidity new keyword](https://docs.soliditylang.org/en/latest/control-structures.html?highlight=new#creating-contracts-via-new)\n- [Importing Code in solidity](https://solidity-by-example.org/import)\n\n## Basic Solidity: Interacting with other Contracts\n\n_[⌨️ (03:16:36) Interacting with other contracts](https://youtu.be/gyMwXuJrbJQ?t=11796)_\n\n- To interact, you always need: ABI + Address\n- [ABI](https://docs.soliditylang.org/en/latest/abi-spec.html?highlight=abi)\n\n## Basic Solidity: Inheritance \u0026 Overrides\n\n_[⌨️ (03:25:23) Inheritance \u0026 Overrides](https://youtu.be/gyMwXuJrbJQ?t=12323)_\n\n- [Inheritance](https://solidity-by-example.org/inheritance)\n- [Override \u0026 Virtual Keyword](https://docs.soliditylang.org/en/latest/contracts.html?highlight=override#function-overriding)\n\n## Lesson 3 Recap\n\n_[⌨️ (03:30:29) Lesson 3 Recap](https://youtu.be/gyMwXuJrbJQ?t=12629)_\n\n# Lesson 4: Remix Fund Me\n\n_[⌨️ (03:31:55) Lesson 4: Remix Fund Me](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=12715s)_\n\n💻 Code: https://github.com/PatrickAlphaC/fund-me-fcc\n\n## Introduction\n\n## Sending ETH Through a Function \u0026 Reverts\n\n- [Fields in a Transaction](https://ethereum.org/en/developers/docs/transactions/)\n- [More on v,r,s](https://ethereum.stackexchange.com/questions/15766/what-does-v-r-s-in-eth-gettransactionbyhash-mean)\n- [payable](https://solidity-by-example.org/payable)\n- [msg.value \u0026 Other global keywords](https://docs.soliditylang.org/en/latest/cheatsheet.html?highlight=cheatsheet#global-variables)\n- [require](https://codedamn.com/news/solidity/what-is-require-in-solidity)\n- [revert](https://medium.com/blockchannel/the-use-of-revert-assert-and-require-in-solidity-and-the-new-revert-opcode-in-the-evm-1a3a7990e06e)\n\n## Chainlink \u0026 Oracles\n\n- [What is a blockchain oracle?](https://chain.link/education/blockchain-oracles)\n- [What is the oracle problem?](https://blog.chain.link/what-is-the-blockchain-oracle-problem/)\n- [Chainlink](https://chain.link/)\n- [Chainlink Price Feeds (Data Feeds)](https://docs.chain.link/docs/get-the-latest-price/)\n  - [data.chain.link](https://data.chain.link/)\n- [Chainlink VRF](https://docs.chain.link/docs/chainlink-vrf/)\n- [Chainlink Keepers](https://docs.chain.link/docs/chainlink-keepers/introduction/)\n- [Chainlink API Calls](https://docs.chain.link/docs/request-and-receive-data/)\n- [Importing Tokens into your Metamask](https://consensys.net/blog/metamask/how-to-add-your-custom-tokens-in-metamask/)\n- [Request and Receive Chainlink Model](https://docs.chain.link/docs/architecture-request-model/)\n\n## Review of Sending ETH and working with Chainlink\n\n## Interfaces \u0026 Price Feeds\n\n- [Chainlink Price Feeds (Data Feeds)](https://docs.chain.link/docs/get-the-latest-price/)\n- [Chainlink GitHub](https://github.com/smartcontractkit/chainlink)\n- [Interface](https://solidity-by-example.org/interface)\n\n## Importing from GitHub \u0026 NPM\n\n- [Chainlink NPM Package](https://www.npmjs.com/package/@chainlink/contracts)\n\n## Floating Point Math in Solidity\n\n- [tuple](https://docs.soliditylang.org/en/latest/abi-spec.html?highlight=tuple#handling-tuple-types)\n- [Floating Point Numbers in Solidity](https://stackoverflow.com/questions/58277234/does-solidity-supports-floating-point-number)\n- [Type Casting](https://ethereum.stackexchange.com/questions/6891/type-casting-in-solidity)\n- Gas Estimation Failed\n  - Someone should make an article explaining this error\n\n## Basic Solidity: Arrays \u0026 Structs II\n\n- [msg.sender](https://docs.soliditylang.org/en/latest/cheatsheet.html?highlight=msg.sender)\n\n## Review of Interfaces, Importing from GitHub, \u0026 Math in Solidity\n\n## Libraries\n\n- [Library](https://docs.soliditylang.org/en/v0.8.14/contracts.html?highlight=library#libraries)\n- [Solidity-by-example Library](https://solidity-by-example.org/library)\n\n## SafeMath, Overflow Checking, and the \"unchecked\" keyword\n\n- [Openzeppelin Safemath](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/math/SafeMath.sol)\n- [unchecked vs. checked](https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic)\n\n## Basic Solidity: For Loop\n\n- [For Loop](https://solidity-by-example.org/loop)\n- `/* */` is another way to make comments\n\n## Basic Solidity: Resetting an Array\n\n## Sending ETH from a Contract\n\n- [Transfer, Send, Call](https://solidity-by-example.org/sending-ether/)\n- [this keyword](https://ethereum.stackexchange.com/questions/1781/what-is-the-this-keyword-in-solidity)\n\n## Basic Solidity: Constructor\n\n- [Constructor](https://solidity-by-example.org/constructor)\n\n## Basic Solidity: Modifiers\n\n- [Double equals](https://www.geeksforgeeks.org/solidity-operators/)\n- [Modifier](https://solidity-by-example.org/function-modifier)\n\n## Testnet Demo\n\n- [Disconnecting Metamask](https://help.1inch.io/en/articles/4666771-metamask-how-to-connect-disconnect-and-switch-accounts-with-metamask-on-1inch-network)\n\n## Advanced Solidity\n\n### Immutable \u0026 Constant\n\n- [Immutable](https://solidity-by-example.org/immutable)\n- [Constant](https://solidity-by-example.org/constants)\n- [Current ETH Gas Prices](https://etherscan.io/gastracker)\n- Don't stress about gas optimizations! (yet)\n- Naming Conventions\n  - [Someone make this!](https://github.com/smartcontractkit/full-blockchain-solidity-course-js/issues/13)\n\n### Custom Errors\n\n- [Custom Errors Introduction](https://blog.soliditylang.org/2021/04/21/custom-errors/)\n\n### Receive \u0026 Fallback Functions\n\n- [Solidity Docs Special Functions](https://docs.soliditylang.org/en/latest/contracts.html?highlight=fallback#special-functions)\n- [Fallback](https://solidity-by-example.org/fallback)\n- [Receive](https://docs.soliditylang.org/en/latest/contracts.html?highlight=fallback#receive-ether-function)\n\n## Lesson 4 Recap\n\n🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed Solidity Basics! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊\n\n# Lesson 5: Ethers.js Simple Storage\n\n_[⌨️ (05:30:42) Lesson 5: Ethers.js Simple Storage](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=19842s)_\n\n💻 Code: https://github.com/PatrickAlphaC/ethers-simple-storage-fcc\n\n🧪 [Alchemy: https://alchemy.com/?a=673c802981](https://alchemy.com/?a=673c802981)\n\n## Effective Debugging Strategies \u0026 Getting Help\n\n_[⌨️ (5:30:46) Effective Debugging Stategies \u0026 Getting Help](https://youtu.be/gyMwXuJrbJQ?t=19846)_\n\n1. Tinker and isolate problem\n   1. For this course, take at LEAST 15 minutes to figure out a bug.\n2. Google / Web Search the Exact problem\n   1. Go to this GitHub Repo / Discussions\n3. Ask a question on a Forum like Stack Exchange Ethereum or Stack Overflow\n   1. Format your questions!!\n   2. Use [Markdown](https://www.markdowntutorial.com/)\n\n### How to Debug Anything Video\n\n- [Patrick's Original Video](https://www.youtube.com/watch?v=XT8STflvwNo)\n\n## Installation \u0026 Setup\n\n- [Visual Studio Code](https://code.visualstudio.com/)\n  - [Crash Course](https://www.youtube.com/watch?v=WPqXP_kLzpo)\n- [NodeJS](https://nodejs.org/en/)\n- [VSCode Keybindings](https://code.visualstudio.com/docs/getstarted/keybindings)\n- [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)\n- [What is a terminal?](https://code.visualstudio.com/docs/editor/integrated-terminal)\n\n### Mac \u0026 Linux Setup\n\n### Windows Setup\n\n- [WSL](https://docs.microsoft.com/en-us/windows/wsl/install)\n  - When working in WSL, use Linux commands instead of Windows commands\n- [TroubleShooting](https://docs.microsoft.com/en-us/windows/wsl/troubleshooting)\n- `curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash`\n\n\u003e ⚠️ Please use Gitpod as an absolute last resort\n\n### Gitpod\n\n- [Gitpod](https://www.gitpod.io/)\n  - **If using this, NEVER share a private key with real money on Gitpod**\n  - Ideally you figure out the MacOS, Linux, or Windows install though\n\n## Local Development Introduction\n\n- `CMD + K` or `CTRL + K` clears the terminal\n- `mkdir ethers-simple-storage-fcc`\n- `code .` to open VSCode in a new VSCode window\n\n### Optional Javascript Crash Courses\n\n- [NodeJS Course](https://www.youtube.com/watch?v=RLtyhwFtXQA)\n- [Javascript Course](https://www.youtube.com/watch?v=jS4aFq5-91M)\n- Import your `SimpleStorage.sol`\n- [Solidity + Hardhat VSCode Extension](https://marketplace.visualstudio.com/items?itemName=NomicFoundation.hardhat-solidity)\n\n- Format your solidity code with:\n\n```\n    \"[solidity]\": {\n        \"editor.defaultFormatter\": \"NomicFoundation.hardhat-solidity\"\n    },\n    \"[javascript]\":{\n      \"editor.defaultFormatter\": \"esbenp.prettier-vscode\"\n    }\n```\n\nIn your `.vscode/settings.json` file.\n\n- [Prettier Extension](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)\n\n## Tiny Javascript Refresher\n\n- [Javascript Tips](https://www.freecodecamp.org/news/learn-javascript-free-js-courses-for-beginners/)\n\n## Asynchronous Programming in Javascript\n\n- [Asynchronous Programming](https://www.bmc.com/blogs/asynchronous-programming/)\n- [async keyword](https://www.w3schools.com/JS//js_async.asp)\n- [Promise in Javascript](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)\n- [await keyword](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await)\n\n## Compiling our Solidity\n\n- [Yarn Install](https://yarnpkg.com/getting-started/install)\n- [solc-js](https://github.com/ethereum/solc-js)\n  - `yarn add solc@0.8.7-fixed`\n- [yarn scripts](https://classic.yarnpkg.com/lang/en/docs/cli/run/)\n\n## Ganache \u0026 Networks\n\n- [Ganache](https://trufflesuite.com/ganache/)\n- Networks in Metamask\n- RPC URL\n- [Geth](https://github.com/ethereum/go-ethereum)\n- [JSON RPC Spec Playground](https://playground.open-rpc.org/?schemaUrl=https://raw.githubusercontent.com/ethereum/execution-apis/assembled-spec/openrpc.json\u0026uiSchema%5BappBar%5D%5Bui:splitView%5D=false\u0026uiSchema%5BappBar%5D%5Bui:input%5D=false\u0026uiSchema%5BappBar%5D%5Bui:examplesDropdown%5D=false)\n\n## Introduction to Ethers.js\n\n- [Ethers.js](https://docs.ethers.io/v5/getting-started/)\n- [prettier-plugin-solidity](https://github.com/prettier-solidity/prettier-plugin-solidity)\n\n### A Note on the await Keyword\n\n## Adding Transaction Overrides\n\n## Transaction Receipts\n\n## Sending a \"raw\" Transaction in Ethers.js\n\n## Interacting with Contracts in Ethers.js\n\n- [EVM Decompiler](https://ethervm.io/decompile)\n- [BigNumber](https://docs.ethers.io/v5/api/utils/bignumber/)\n\n## Environment Variables\n\n- [dotenv](https://www.npmjs.com/package/dotenv)\n- [.gitignore](https://www.atlassian.com/git/tutorials/saving-changes/gitignore)\n\n## Better Private Key Management\n\n- [wallet.encrypt](https://docs.ethers.io/v5/api/signer/#Wallet-encrypt)\n- [THE .ENV PLEDGE](https://github.com/smartcontractkit/full-blockchain-solidity-course-js/discussions/5)\n\n## Optional Prettier Formatting\n\n- [Prettier](https://prettier.io/docs/en/index.html)\n- [Best README Template](https://github.com/othneildrew/Best-README-Template)\n\n## Deploying to a Testnet or a Mainnet\n\n- [Alchemy](https://alchemy.com/?a=673c802981)\n- [Getting your private key from Metamask](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key)\n- `CTRL + C` stops any terminal command\n\n## Verifying on Block Explorers from the UI\n\n## Alchemy Dashboard \u0026 The Mempool\n\n- [Special Guest Albert Hu](https://twitter.com/thatguyintech)\n- [Mempool](https://ethereum.org/en/developers/tutorials/sending-transactions-using-web3-and-alchemy/#see-your-transaction-in-the-mempool)\n\n## Lesson 5 Recap\n\n### Typescript Ethers Simple Storage\n\n# Lesson 6: Hardhat Simple Storage\n\n_[⌨️ (08:20:17) Lesson 6: Hardhat Simple Storage](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=30017s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-simple-storage-fcc\n\n## Introduction\n\n_[⌨️ (08:20:19) Introduction](https://youtu.be/gyMwXuJrbJQ?t=30019)_\n\n## Hardhat Setup\n\n_[⌨️ (08:22:47) Hardhat Setup](https://youtu.be/gyMwXuJrbJQ?t=30167)_\n\n- [Hardhat Documentation](https://hardhat.org/)\n- [DevDependencies vs Dependencies](https://stackoverflow.com/questions/18875674/whats-the-difference-between-dependencies-devdependencies-and-peerdependencies)\n- [@ Sign node modules](https://stackoverflow.com/questions/36667258/what-is-the-meaning-of-the-at-prefix-on-npm-packages)\n\n### Troubleshooting Hardhat Setup\n\n_[⌨️ (08:29:43) Troubleshooting Hardhat Setup](https://youtu.be/gyMwXuJrbJQ?t=30583)_\n\n- [Special Guest Cami Ramos Garzon](https://twitter.com/camiinthisthang)\n\n## Hardhat Setup Continued\n\n_[⌨️ (08:31:48) Hardhat Setup Continued](https://youtu.be/gyMwXuJrbJQ?t=30708)_\n\n## Deploying SimpleStorage from Hardhat\n\n_[⌨️ (08:33:10) Deploying SimpleStorage from Hardhat](https://youtu.be/gyMwXuJrbJQ?t=30790)_\n\n## Networks in Hardhat\n\n_[⌨️ (08:41:44) Networks in Hardhat](https://youtu.be/gyMwXuJrbJQ?t=31304)_\n\n- [The Hardhat Network](https://hardhat.org/hardhat-network/)\n- [Hardhat configuration](https://hardhat.org/config/#configuration)\n- [Chain ID List](https://chainlist.org/)\n\n## Programmatic Verification\n\n_[⌨️ (08:51:16) Programmatic Verification](https://youtu.be/gyMwXuJrbJQ?t=31876)_\n\n- [Etherscan Verify Tutorial](https://docs.etherscan.io/tutorials/verifying-contracts-programmatically)\n- [Etherscan Docs](https://docs.etherscan.io/)\n- [Hardhat-Etherscan](https://hardhat.org/plugins/nomiclabs-hardhat-etherscan.html)\n- [Etherscan API Keys](https://info.etherscan.com/api-keys/)\n- [Javascript == vs ===](https://stackoverflow.com/questions/359494/which-equals-operator-vs-should-be-used-in-javascript-comparisons)\n\n## Interacting with Contracts in Hardhat\n\n_[⌨️ (09:06:37) Interacting with Contracts in Hardhat](https://youtu.be/gyMwXuJrbJQ?t=32797)_\n\n## Artifacts Troubleshooting\n\n_[⌨️ (09:09:42) Artifacts Troubleshooting](https://youtu.be/gyMwXuJrbJQ?t=32982)_\n\n## Custom Hardhat Tasks\n\n_[⌨️ (09:10:52) Custom Hardhat Tasks](https://youtu.be/gyMwXuJrbJQ?t=33052)_\n\n- [Hardhat Tasks](https://hardhat.org/guides/create-task.html)\n- [Javascript Arrow Functions](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions)\n\n## Hardhat Localhost Node\n\n_[⌨️ (09:18:12) Hardhat Localhost Node](https://youtu.be/gyMwXuJrbJQ?t=33492)_\n\n## The Hardhat Console\n\n_[⌨️ (09:23:11) The Hardhat Console](https://youtu.be/gyMwXuJrbJQ?t=33791)_\n\n- [Hardhat Console](https://hardhat.org/guides/hardhat-console.html)\n\n## Hardhat Tests\n\n_[⌨️ (09:26:13) Hardhat Tests](https://youtu.be/gyMwXuJrbJQ?t=33973)_\n\n- [Hardhat Tests](https://hardhat.org/tutorial/testing-contracts.html#_5-testing-contracts)\n- [Mocha Style Tests](https://mochajs.org/)\n- [Chai](https://www.npmjs.com/package/chai)\n- [Waffle Tests](https://ethereum-waffle.readthedocs.io/en/latest/)\n\n## Hardhat Gas Reporter\n\n_[⌨️ (09:38:10) Hardhat Gas Reporter](https://youtu.be/gyMwXuJrbJQ?t=34690)_\n\n- [Hardhat Gas Reporter](https://www.npmjs.com/package/hardhat-gas-reporter)\n- [Coinmarketcap API](https://coinmarketcap.com/api/)\n\n## Solidity Coverage\n\n_[⌨️ (09:44:40) Solidity Coverage](https://youtu.be/gyMwXuJrbJQ?t=35080)_\n\n- [Solidity Coverage](https://github.com/sc-forks/solidity-coverage)\n\n## Hardhat Waffle\n\n_[⌨️ (09:47:02) Hardhat Waffle](https://youtu.be/gyMwXuJrbJQ?t=35222)_\n\n- [Hardhat-Waffle](https://npm.io/package/@nomiclabs/hardhat-waffle)\n\n## Lesson 6 Recap\n\n_[⌨️ (09:47:37) Lesson 6 Recap](https://youtu.be/gyMwXuJrbJQ?t=35257)_\n\n### Typescript Hardhat Simple Storage\n\n_[⌨️ (09:52:15) Typescript Hardhat Simple Storage](https://youtu.be/gyMwXuJrbJQ?t=35535)_\n\n- [Typechain](https://github.com/dethcrypto/TypeChain)\n\n```\nyarn add --dev @typechain/ethers-v5 @typechain/hardhat @types/chai @types/node @types/mocha ts-node typechain typescript\n```\n\n# Lesson 7: Hardhat Fund Me\n\n_[⌨️ (10:00:48) Lesson 7: Hardhat Fund Me](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=36048s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-fund-me-fcc\n\n## Introduction\n\n_[⌨️ (10:00:50) Introduction](https://youtu.be/gyMwXuJrbJQ?t=36050)_\n\n## Hardhat Setup - Fund Me\n\n_[⌨️ (10:03:41) Hardhat Setup - Fund Me](https://youtu.be/gyMwXuJrbJQ?t=36221)_\n\n## Linting\n\n_[⌨️ (10:06:20) Linting](https://youtu.be/gyMwXuJrbJQ?t=36380)_\n\n- [Eslint](https://eslint.org/)\n- [Solhint](https://github.com/protofire/solhint)\n- [Linting Code](https://www.perforce.com/blog/qac/what-lint-code-and-why-linting-important)\n\n## Hardhat Setup - Fund Me - Continued\n\n_[⌨️ (10:07:47) Hardhat Setup - Fund Me - Continued](https://youtu.be/gyMwXuJrbJQ?t=36467)_\n\n## Importing from NPM\n\n_[⌨️ (10:09:38) Importing from NPM](https://youtu.be/gyMwXuJrbJQ?t=36578)_\n\n- [@chainlink/contracts](https://www.npmjs.com/package/@chainlink/contracts)\n\n## Hardhat Deploy\n\n_[⌨️ (10:10:43) Hardhat Deploy](https://youtu.be/gyMwXuJrbJQ?t=36643)_\n\n- [Hardhat Deploy](https://github.com/wighawag/hardhat-deploy)\n\n## Mocking\n\n_[⌨️ (10:21:05) Mocking](https://youtu.be/gyMwXuJrbJQ?t=37265)_\n\n- [Mocking](https://stackoverflow.com/questions/2665812/what-is-mocking)\n- [Aave Github](https://github.com/aave/aave-v3-core)\n- [Chainlink Github](https://github.com/smartcontractkit/chainlink)\n- Multiple Versions of Solidity\n- Tags in hardhat\n\n## Utils Folder\n\n_[⌨️ (10:52:51) Utils Folder](https://youtu.be/gyMwXuJrbJQ?t=39171)_\n\n## Testnet Demo - Hardhat Fund Me\n\n_[⌨️ (10:55:45) Testnet Demo - Hardhat Fund Me](https://youtu.be/gyMwXuJrbJQ?t=39345)_\n\n- Hardhat Deploy Block Confirmations\n\n### TypeScript\n\n- [Code file](https://github.com/PatrickAlphaC/hardhat-fund-me-fcc/blob/84271e7002e55d86c90b26466ff27bc067f25de0/deploy/01-deploy-fund-me.ts#L29) (TypeScript edition)\n- Define blockConfirmations in the `helper-hardhat-config.ts` file instead of `hardhat-config.js`.\n\n## Solidity Style Guide\n\n_[⌨️ (11:00:10) Solidity Style Guide](https://youtu.be/gyMwXuJrbJQ?t=39610)_\n\n- [Style Guide](https://docs.soliditylang.org/en/latest/style-guide.html)\n- [NatSpec](https://docs.soliditylang.org/en/latest/natspec-format.html)\n\n## Testing Fund Me\n\n_[⌨️ (11:08:36) Testing Fund Me](https://youtu.be/gyMwXuJrbJQ?t=40116)_\n\n- [Unit Testing](https://en.wikipedia.org/wiki/Unit_testing)\n- [Hardhat Deploy Fixtures](https://github.com/wighawag/hardhat-deploy#creating-fixtures)\n- [ethers.getContract](https://github.com/wighawag/hardhat-deploy-ethers)\n- [expect](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html)\n- [ethers.utils.parseUnits](https://docs.ethers.io/v5/api/utils/display-logic/#utils-parseUnits)\n- [Waffle Chai Matchers](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html)\n\n## Breakpoints \u0026 Debugging\n\n_[⌨️ (11:30:39) Breakpoints \u0026 Debugging](https://youtu.be/gyMwXuJrbJQ?t=41439)_\n\n- [VSCode Breakpoints](https://code.visualstudio.com/Docs/editor/debugging)\n\n## Gas III\n\n_[⌨️ (11:33:40) Gas III](https://youtu.be/gyMwXuJrbJQ?t=41620)_\n\n- [Transaction Response](https://docs.ethers.io/v5/api/providers/types/#providers-TransactionResponse)\n- [Transaction Receipt](https://docs.ethers.io/v5/api/providers/types/#providers-TransactionReceipt)\n\n## console.log \u0026 Debugging\n\n_[⌨️ (11:36:35) console.log \u0026 Debugging](https://youtu.be/gyMwXuJrbJQ?t=41795)_\n\n- [Hardhat console.log](https://hardhat.org/hardhat-network/reference/#console-log)\n\n## Testing Fund Me II\n\n_[⌨️ (11:37:31) Testing Fund Me II](https://youtu.be/gyMwXuJrbJQ?t=41851)_\n\n## Storage in Solidity\n\n_[⌨️ (11:44:34) Storage in Solidity](https://youtu.be/gyMwXuJrbJQ?t=42274)_\n\n- [Storage Layout](https://docs.soliditylang.org/en/latest/internals/layout_in_storage.html)\n- [Purpose of the memory keyword](https://stackoverflow.com/questions/33839154/in-ethereum-solidity-what-is-the-purpose-of-the-memory-keyword)\n- [getStorageAt](https://docs.ethers.io/v5/api/providers/provider/#Provider-getStorageAt)\n\n## Gas Optimizations using Storage Knowledge\n\n_[⌨️ (11:52:38) Gas Optimizations using Storage Knowledge](https://youtu.be/gyMwXuJrbJQ?t=42758)_\n\n- [Opcodes](https://ethereum.org/en/developers/docs/evm/opcodes/)\n- [Opcodes by Gas](https://github.com/crytic/evm-opcodes)\n- [Opcodes by Gas](https://evm.codes/)\n- Append `s_` to storage variables\n- Append `i_` to immutable variables\n- Caps lock and underscore constant variables\n\n## Solidity Chainlink Style Guide\n\n_[⌨️ (12:05:29) Solidity Chainlink Style Guide](https://youtu.be/gyMwXuJrbJQ?t=43529)_\n\n- [Chainlink Solidity Style Guide](https://github.com/smartcontractkit/full-blockchain-solidity-course-js/issues/13)\n\n## Storage Review\n\n_[⌨️ (12:09:59) Storage Review](https://youtu.be/gyMwXuJrbJQ?t=43799)_\n\n## Staging Tests\n\n_[⌨️ (12:11:43) Staging Tests](https://youtu.be/gyMwXuJrbJQ?t=43903)_\n\n- [Ternary](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator)\n\n## Running Scripts on a Local Node\n\n_[⌨️ (12:17:58) Running Scripts on a Local Node](https://youtu.be/gyMwXuJrbJQ?t=44278)_\n\n## Adding Scripts to your package.json\n\n_[⌨️ (12:22:00) Adding Scripts to your package.json](https://youtu.be/gyMwXuJrbJQ?t=44520)_\n\n## Pushing to GitHub\n\n_[⌨️ (12:25:17) Pushing to GitHub](https://youtu.be/gyMwXuJrbJQ?t=44717)_\n\n- [Github Quickstart](https://docs.github.com/en/get-started/quickstart)\n- [What is Git?](https://www.git-scm.com/book/en/v2/Getting-Started-What-is-Git%3F)\n- [The quickstart that we follow in the video](https://docs.github.com/en/get-started/importing-your-projects-to-github/importing-source-code-to-github/adding-locally-hosted-code-to-github#adding-a-local-repository-to-github-using-git)\n- [Learn about git and GitHub](https://www.youtube.com/watch?v=RGOj5yH7evk)\n\n## 🐸🐦 [Tweet Me (add your repo in)!](https://twitter.com/intent/tweet?text=I%20just%20made%20my%20first%20Smart%20Contract%20repo%20using%20@solidity_lang,%20@HardhatHQ,%20@chainlink,%20@AlchemyPlatform,%20and%20more!%0a%0aThanks%20@PatrickAlphaC!!)\n\n# Lesson 8: HTML / Javascript Fund Me (Full Stack / Front End)\n\n_[⌨️ (12:32:57) Lesson 8: HTML / Javascript Fund Me (Full Stack / Front End)](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=45177s)_\n\n💻 Code: https://github.com/PatrickAlphaC/html-fund-me-fcc\n\n## Introduction\n\n## How Websites work with Web3 Wallets\n\n- [How to Connect your Smart Contracts to Metamask](https://www.youtube.com/watch?v=pdsYCkUWrgQ)\n  - 💻 Code from Video: https://github.com/PatrickAlphaC/full-stack-web3-metamask-connectors\n  - ✍️ Article from Video: https://betterprogramming.pub/everything-you-need-to-know-about-fullstack-web3-94c0f1b18019?sk=a2764bcbdae98bf05e1052931de77982\n\n## HTML Setup\n\n- Live Server: ExtensionID: ritwickdey.LiveServer\n\n## Connecting HTML to Metamask\n\n- [Metamask Docs](https://docs.metamask.io/guide/)\n\n## Javascript in it's own file\n\n## ES6 vs Nodejs\n\n- [ES6 vs Nodesjs](https://stackoverflow.com/questions/31354559/using-node-js-require-vs-es6-import-export#31367852)\n- [Ethers docs for web browser](https://docs.ethers.io/v5/getting-started/#getting-started--importing--web-browser)\n- [module vs text/javascript](https://stackoverflow.com/questions/51418964/script-type-text-javascript-vs-script-type-module)\n\n## Sending a transaction from a Website\n\n- [Web3Provider](https://docs.ethers.io/v5/api/providers/other/#Web3Provider)\n- [Adding a network to metamask](https://metamask.zendesk.com/hc/en-us/articles/360043227612-How-to-add-a-custom-network-RPC)\n\n## Resetting an Account in Metamask\n\n```\nMetaMask - RPC Error:\n[ethjs-query] while formatting ouputs from RPC '{\"value\":{\"code\":-32603,\"data\":{\"code\":-32000,\"message\":\"Nonce too high. Expected nonce to be 2 but got 4. Note that transactions can't be queued when automining.\"}}}'\n```\n\n## Listening for Events and Completed Transactions\n\n- [provider.once](https://docs.ethers.io/v5/api/providers/provider/#Provider-once)\n- [Anonymous function](https://www.geeksforgeeks.org/javascript-anonymous-functions/)\n- [Javascript Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)\n\n## Input Forms\n\n## Reading from the Blockchain\n\n## Withdraw Function\n\n## Lesson 8 Recap\n\n### Optional Links:\n\n- [Browserify](https://browserify.org/)\n- [Watchify](https://www.npmjs.com/package/watchify)\n\n# Lesson 9: Hardhat Smart Contract Lottery\n\n_[⌨️ (13:41:02) Lesson 9: Hardhat Smart Contract Lottery](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=49262s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-smartcontract-lottery-fcc\n\n## Introduction\n\n## Hardhat Setup - Smart Contract Lottery\n\n_[⌨️ (13:43:43) Hardhat Setup](https://youtu.be/gyMwXuJrbJQ?t=49423)_\n\n- Install dependencies:\n\n```bash\nyarn add --dev @nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers ethers @nomiclabs/hardhat-etherscan @nomiclabs/hardhat-waffle chai ethereum-waffle hardhat hardhat-contract-sizer hardhat-deploy hardhat-gas-reporter prettier prettier-plugin-solidity solhint solidity-coverage dotenv\n```\n\n- Install dependencies (Typescript version):\n\n```bash\nyarn add --dev @nomiclabs/hardhat-ethers@npm:hardhat-deploy-ethers ethers @nomiclabs/hardhat-etherscan @nomiclabs/hardhat-waffle chai ethereum-waffle hardhat hardhat-contract-sizer hardhat-deploy hardhat-gas-reporter prettier prettier-plugin-solidity solhint solidity-coverage dotenv @typechain/ethers-v5 @typechain/hardhat @types/chai @types/node ts-node typechain typescript\n```\n\n## Raffle.sol Setup\n\n_[⌨️ (13:46:55) Raffle.sol Setup](https://youtu.be/gyMwXuJrbJQ?t=49615)_\n\n- [Custom Errors in Solidity](https://blog.soliditylang.org/2021/04/21/custom-errors/)\n\n## Introduction to Events\n\n_[⌨️ (13:54:02) Introduction to Events](https://youtu.be/gyMwXuJrbJQ?t=50042)_\n\n- [Events \u0026 Logging Video](https://www.youtube.com/watch?v=KDYJC85eS5M)\n- [Events \u0026 Logging in Hardhat](https://github.com/PatrickAlphaC/hardhat-events-logs)\n\n## Events in Raffle.sol\n\n_[⌨️ (14:00:47) Events in Raffle.sol](https://youtu.be/gyMwXuJrbJQ?t=50447)_\n\n## Introduction to Chainlink VRF\n\n_[⌨️ (14:02:30) Introduction to Chainlink VRF](https://youtu.be/gyMwXuJrbJQ?t=50550)_\n\n- [Special Guest Stephen Fluin](https://twitter.com/stephenfluin)\n\n### Sub-Lesson: Chainlink VRF\n\n\u003e - [Chainlink VRFv2 Docs](https://docs.chain.link/docs/get-a-random-number/)\n\u003e - [Chainlink VRFv2 Walkthrough](https://www.youtube.com/watch?v=rdJ5d8j1RCg)\n\u003e - [Chainlink Contracts](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/VRFConsumerBase.sol)\n\n## Implementing Chainlink VRF - Introduction\n\n_[⌨️ (14:09:53) Implementing Chainlink VRF](https://youtu.be/gyMwXuJrbJQ?t=50993)_\n\n### Hardhat Shorthand\n\n- [Hardhat Shorthand](https://hardhat.org/guides/shorthand.html)\n\n## Implementing Chainlink VRF - The Request\n\n## Implementing Chainlink VRF - The FulFill\n\n### Modulo\n\n- [Modulo](https://docs.soliditylang.org/en/latest/types.html?highlight=modulo#modulo)\n\n## Introduction to Chainlink Keepers\n\n- [Chainlink Keepers Docs](https://docs.chain.link/docs/chainlink-keepers/introduction/)\n- [Chainlink Keepers Walkthrough](https://www.youtube.com/watch?v=-Wkw5JVQGUo)\n\n## Implementing Chainlink Keepers - checkUpkeep\n\n### Enums\n\n- [Enum](https://docs.soliditylang.org/en/latest/structure-of-a-contract.html?highlight=enum#enum-types)\n\n## Implementing Chainlink Keepers - checkUpkeep continued\n\n- block.timestamp\n\n## Implementing Chainlink Keepers - performUpkeep\n\n## Code Cleanup\n\n## Deploying Raffle.sol\n\n### Mock Chainlink VRF Coordinator\n\n### Continued\n\n- [LINK Token](https://docs.chain.link/docs/link-token-contracts/)\n\n## Raffle.sol Unit Tests\n\n- We use `async function` in the describe blocks at the start, but we correctly take them out later.\n\n### Testing Events \u0026 Chai Matchers\n\n- [Emit Chai Matcher](https://ethereum-waffle.readthedocs.io/en/latest/matchers.html#emitting-events)\n\n### Continued I\n\n## Hardhat Methods \u0026 Time Travel\n\n- [Make Hardhat do whatever you want it to](https://hardhat.org/hardhat-network/reference/)\n- [Special debugging hardhat methods](https://hardhat.org/hardhat-network/reference/#special-testing-debugging-methods)\n\n### Continued II\n\n## Callstatic\n\n- [Callstatic](https://docs.ethers.io/v5/api/contract/contract/#contract-callStatic)\n\n### Continued III\n\n### Massive Promise Test\n\n### Continued IV\n\n## Raffle.sol Staging Tests\n\n## Testing on a Testnet\n\n### Recommended LINK amounts for Sepolia Staging Test:\n\n- Chainlink VRF: 2 LINK\n- Chainlink Keepers: 8 LINK\n\n## Conclusion\n\n## Typescript - Smart Contract Lottery\n\n🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed Hardhat Basics! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊\n\n# Lesson 10: NextJS Smart Contract Lottery (Full Stack / Front End)\n\n_[⌨️ (16:34:07) Lesson 10: NextJS Smart Contract Lottery (Full Stack / Front End)](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=59647s)_\n\n💻 Code: https://github.com/PatrickAlphaC/nextjs-smartcontract-lottery-fcc\n\n⚡️⚡️ Live Demo IPFS: ipfs://QmXwACyjcS8tL7UkYwimpqMqW9sKzSHUjE4uSZBSyQVuEH\n\n⚡️⚡️ Live Demo Fleek: https://fancy-dream-3458.on.fleek.co/\n\n## Introduction\n\nWe move into using [NextJS](https://nextjs.org/) for our front end. NextJS is a [React framework](https://reactjs.org/) for building websites.\n\n### Optional Sub-Lesson: Full Stack Development \u0026 Other Libraries\n\n- [6 Ways to connect your dapp to a wallet](https://www.youtube.com/watch?v=pdsYCkUWrgQ)\n- [NextJS Crash Course](https://www.youtube.com/watch?v=mTz0GXj8NN0)\n- Other React libraries:\n  - [Web3React](https://github.com/NoahZinsmeister/web3-react)\n  - [wagmi](https://github.com/tmm/wagmi)\n  - [react-moralis](https://www.npmjs.com/package/react-moralis)\n  - [useDapp](https://github.com/TrueFiEng/useDApp)\n  - [Web3Modal](https://github.com/Web3Modal/web3modal)\n  - [useMetamask](https://github.com/mdtanrikulu/use-metamask)\n- Other Full Stack Web3 Templates\n  - [scaffold-eth](https://github.com/scaffold-eth/scaffold-eth)\n  - [ethereum-boilerplate](https://github.com/ethereum-boilerplate/ethereum-boilerplate)\n  - [create-eth-app](https://github.com/paulrberg/create-eth-app)\n- [React being quite popular](https://insights.stackoverflow.com/survey/2021#section-most-popular-technologies-web-frameworks)\n- [Why use react?](https://www.freecodecamp.org/news/why-use-react-for-web-development/)\n\n## NextJS Setup\n\n- [NextJS Documentation](https://nextjs.org/learn/basics/create-nextjs-app)\n- [NextJS Minimal Ethers Example For Lottery](https://github.com/PatrickAlphaC/nextjs-ethers-introduction)\n\n```\nyarn create next-app .\n```\n\n## Manual Header I\n\n- [What is a component?](https://www.w3schools.com/react/react_components.asp)\n- [jsx](https://reactjs.org/docs/introducing-jsx.html)\n- [Moralis](https://moralis.io/)\n- [React Moralis](https://github.com/MoralisWeb3/react-moralis)\n\n### React Hooks\n\n- [What is a react hook?](https://reactjs.org/docs/hooks-overview.html)\n\n## Manual Header II\n\n## useEffect Hook\n\n- [useEffect Hook](https://reactjs.org/docs/hooks-effect.html)\n- [More on useEffect](https://blog.logrocket.com/guide-to-react-useeffect-hook/)\n- [React Context](https://www.freecodecamp.org/news/react-context-for-beginners/)\n  - [useEffect Firing Twice](https://stackoverflow.com/questions/60618844/react-hooks-useeffect-is-called-twice-even-if-an-empty-array-is-used-as-an-ar)\n\n## Local Storage\n\n- [Local Storage](https://codinglead.co/javascript/what-is-localstorage)\n\n## isWeb3EnabledLoading\n\n## web3uikit\n\n- [web3uikit](https://github.com/web3ui/web3uikit)\n- [web3uikit interactive docs](https://web3ui.github.io/web3uikit/?path=/story/1-web3-blockie--custom-seed)\n- [web3uikit connect button](https://web3ui.github.io/web3uikit/?path=/story/1-web3-connectbutton--default)\n\n## Introduction to Calling Functions in Nextjs\n\n- [useWeb3Contract](https://github.com/MoralisWeb3/react-moralis#useweb3contract)\n\n### Automatic Constant Value UI Updater\n\n- [ethers.utils.FormatTypes](https://docs.ethers.io/v5/api/utils/abi/fragments/#fragments--formats)\n\n### runContractFunction\n\n- [Moralis Provider](https://github.com/MoralisWeb3/react-moralis#wrap-your-app-in-a-moralisprovider)\n- [useMoralis](https://github.com/MoralisWeb3/react-moralis#usemoralis)\n- [parseInt](https://www.w3schools.com/JSREF/jsref_parseint.asp)\n\n## useState\n\n- [useState Hook](https://reactjs.org/docs/hooks-state.html)\n\n## Calling Functions in NextJS\n\n## useNotification\n\n- Add `onError` to all your `runContractFunction` calls\n\n## Reading \u0026 Displaying Contract Data\n\n## A Note about `onSuccess`\n\n- `onSuccess` just checks to see if MetaMask sends the transaction, not\n\n## A Challenge to You\n\n## Tailwind \u0026 Styling\n\n- [Learn CSS](https://www.w3schools.com/css/)\n- [Tailwindcss](https://tailwindcss.com/)\n- [PostCSS Extension](https://marketplace.visualstudio.com/items?itemName=csstools.postcss)\n- [Tailwind Extension](https://marketplace.visualstudio.com/items?itemName=bradlc.vscode-tailwindcss)\n- [Install Tailwind into NextJS](https://tailwindcss.com/docs/guides/nextjs)\n\n## Introduction to Hosting your Site\n\n_[⌨️ (18:12:50) Introdunction to Hosting your Site](https://youtu.be/gyMwXuJrbJQ?t=65570)_\n\n- [Vercel](https://vercel.com/)\n- [Moralis](https://moralis.io/)\n- [Netilfy](https://www.netlify.com/)\n- [IPFS](https://ipfs.io/)\n\n## IPFS\n\n_[⌨️ (18:15:14) IPFS](https://youtu.be/gyMwXuJrbJQ?t=65714)_\n\n- [What is IPFS](https://www.youtube.com/watch?v=5Uj6uR3fp-U)\n- [IPFS](https://ipfs.io/)\n\n## Hosting on IPFS\n\n_[⌨️ (18:18:51) Hosting on IPFS](https://youtu.be/gyMwXuJrbJQ?t=65931)_\n\n- [IPFS Companion](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch)\n- [Brave Browser](https://brave.com/)\n- `yarn build \u0026\u0026 yarn next export`\n\n## Hosting on IPFS \u0026 Filecoin using Fleek\n\n_[⌨️ (18:25:45) Hosting on IPFS \u0026 Filecoin using Fleek](https://youtu.be/gyMwXuJrbJQ?t=66345)_\n\n- [Fleek](https://fleek.co/)\n\n## Filecoin Overview\n\n_[⌨️ (18:31:28) Filecoin Overview](https://youtu.be/gyMwXuJrbJQ?t=66688)_\n\n- [Special Guest Ally Haire](https://twitter.com/DeveloperAlly)\n- [IPFS URL of Ally's Video](ipfs://bafybeiasd6oxqiefoxgtskrokomexnb4zcq3fhwlcbyplx2paw65zmq2du)\n\n## Lesson 10 Recap\n\n# Lesson 11: Hardhat Starter Kit\n\n_[⌨️ (18:51:36) Lesson 11: Hardhat Starter Kit](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=67896s)_\n\n💻 Code: https://github.com/smartcontractkit/hardhat-starter-kit\n\n# Lesson 12: Hardhat ERC20s\n\n_[⌨️ (18:59:24) Lesson 12: Hardhat ERC20s](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=68364s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-erc20-fcc\n\n## What is an ERC? What is an EIP?\n\n- [What is an EIP?](https://eips.ethereum.org/)\n- [EIPs codebase](https://github.com/ethereum/EIPs)\n\n## What is an ERC20?\n\n- [Video (using brownie/python)](https://youtu.be/8rpir_ZSK1g?t=39)\n- [EIP-20](https://eips.ethereum.org/EIPS/eip-20)\n- [ERC-677](https://github.com/ethereum/EIPs/issues/677)\n- [EIP-777](https://eips.ethereum.org/EIPS/eip-777)\n\n## Manually Creating an ERC20 Token\n\n## Creating an ERC20 Token with Openzeppelin\n\n- [Openzeppelin](https://openzeppelin.com/)\n- [Openzeppelin Contracts](https://github.com/OpenZeppelin/openzeppelin-contracts)\n- [Solmate (Openzeppelin alternative)](https://github.com/Rari-Capital/solmate)\n\n## Lesson 12 Recap\n\n# Lesson 13: Hardhat DeFi \u0026 Aave\n\n_[⌨️ (19:16:13) Lesson 13: Hardhat DeFi \u0026 Aave](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=69373s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-defi-fcc\n\n## What is DeFi?\n\n- [What is DeFi?](https://chain.link/education/defi)\n- [DefiLlama](https://defillama.com/)\n\n## What is Aave?\n\n- [Aave](https://aave.com/)\n- [My Previous Aave Video on Shorting Assets](https://www.youtube.com/watch?v=TmNGAvI-RUA)\n\n## Programmatic Borrowing \u0026 Lending\n\n- [DAI](https://makerdao.com/en/)\n- [Uniswap](https://app.uniswap.org/)\n\n## WETH - Wrapped ETH\n\n- [WETH Token Sepolia Etherscan](https://sepolia.etherscan.io/address/0xdd13E55209Fd76AfE204dBda4007C227904f0a81)\n- [WETH Token Mainnet](https://etherscan.io/token/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)\n\n## Forking Mainnet\n\n- [Mainnet Forking](https://hardhat.org/hardhat-network/guides/mainnet-forking.html)\n\n## Depositing into Aave\n\n- [Aave V2 Docs](https://docs.aave.com/developers/v/2.0/)\n- [Aave NPM](https://www.npmjs.com/package/@aave/protocol-v2)\n\n## Borrowing from Aave\n\n- [Aave Borrowing FAQs](https://docs.aave.com/faq/borrowing)\n- [Health Factor](https://docs.aave.com/faq/borrowing#what-is-the-health-factor)\n- [Aave Risk Parameters](https://docs.aave.com/risk/asset-risk/risk-parameters)\n\n## Repaying with Aave\n\n## Visualizing the Transactions\n\n- [aTokens](https://docs.aave.com/developers/v/1.0/developing-on-aave/the-protocol/atokens)\n\n## Lesson 13 Recap\n\n## Happy Bow-Tie Friday with Austin Griffith\n\n- [Special Guest Austin Griffith](https://twitter.com/austingriffith)!\n- [Speed Run Ethereum](https://speedrunethereum.com/)\n\n### More DeFi Learnings:\n\n- [Defi-Minimal](https://github.com/smartcontractkit/defi-minimal/tree/main/contracts)\n- [Defi Dad](https://www.youtube.com/channel/UCatItl6C7wJp9txFMbXbSTg)\n\n# Lesson 14: Hardhat NFTs (EVERYTHING you need to know about NFTs)\n\n_[⌨️ (20:28:51) Lesson 14: Hardhat NFTs ](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=73731s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-nft-fcc\n\n## What is an NFT?\n\n- [Video](https://www.youtube.com/watch?v=9yuHz6g_P50)\n- [Optional: All on Chain SVG NFT](https://www.youtube.com/watch?v=9oERTH9Bkw0)\n- [EIP-721](https://eips.ethereum.org/EIPS/eip-721)\n\n## Code Overview\n\n- [Opensea Testnet](https://testnets.opensea.io/)\n\n## Hardhat Setup\n\n## Basic NFT\n\n### Write Tests\n\n- [Openzeppelin NFT](https://docs.openzeppelin.com/contracts/4.x/)\n\n## Random IPFS NFT\n\n### Mapping Chainlink VRF Requests\n\n### Creating Rare NFTs\n\n### Setting the NFT Image\n\n### Setting an NFT Mint Price\n\n### Deploy Script\n\n### Uploading Token Images with Pinata\n\n- [Pinata](https://pinata.cloud)\n- [nft.storage](https://nft.storage)\n- [Pinata NPM](https://www.npmjs.com/package/@pinata/sdk)\n- [Pinata Docs](https://docs.pinata.cloud/)\n\n### Uploading Token URIs (metadata) with Pinata\n\n### Deploying\n\n### Tests\n\n## Dynamic SVG On-Chain NFT\n\n- [Patrick's Original Video](https://www.youtube.com/watch?v=9oERTH9Bkw0)\n\n### What is an SVG?\n\n- [SVG Tutorial](https://www.w3schools.com/graphics/svg_intro.asp)\n  - [On-Chain SVG Example](https://opensea.io/assets/matic/0x291ff90b9c410f56e047599bfee6b585c0c484d7/2)\n\n### Initial Code\n\n### Base64 Encoding\n\n- [Base64 Encoding](https://en.wikipedia.org/wiki/Base64)\n  - [Example Encoder](https://base64.guru/converter/encode/image/svg)\n- [base64-sol](https://www.npmjs.com/package/base64-sol/v/1.0.1)\n\n## Advanced: EVM Opcodes, Encoding, and Calling\n\n### abi.encode \u0026 abi.encodePacked\n\n- [abi.encode](https://docs.soliditylang.org/en/latest/cheatsheet.html?highlight=cheatsheet#global-variables)\n- [abi.encodePacked](https://docs.soliditylang.org/en/latest/cheatsheet.html?highlight=cheatsheet#global-variables)\n  Thanks to [Alex Roan](https://twitter.com/alexroan) for his help on this session!\n- [Example Contract Creation Transaction](https://etherscan.io/tx/0x112133a0a74af775234c077c397c8b75850ceb61840b33b23ae06b753da40490)\n  What REALLY is the ABI?\n- [EVM Opcodes](https://www.evm.codes/)\n- [More EVM Opcodes](https://github.com/crytic/evm-opcodes)\n- [Solidity Cheatsheet](https://docs.soliditylang.org/en/latest/cheatsheet.html?highlight=encodewithsignature)\n- [abi.encode vs abi.encodePacked](https://ethereum.stackexchange.com/questions/91826/why-are-there-two-methods-encoding-arguments-abi-encode-and-abi-encodepacked)\n\n### Introduction to Encoding Function Calls Directly\n\n### Introduction to Encoding Function Calls Recap\n\n### Encoding Function Calls Directly\n\n- [Function Selector](https://blog.openzeppelin.com/deconstructing-a-solidity-contract-part-iii-the-function-selector-6a9b6886ea49/)\n- [Function Signature](https://twitter.com/PatrickAlphaC/status/1517156225670078465)\n\n### Creating an NFT TokenURI on-Chain\n\n### Making the NFT Dynamic\n\n### Deploy Script\n\n## Deploying the NFTs to a Testnet\n\n## Lesson 14 Recap\n\nExtra credit:\n\n- [Deconstructing Solidity](https://blog.openzeppelin.com/deconstructing-a-solidity-contract-part-ii-creation-vs-runtime-6b9d60ecb44c/)\n- [Knowing and controlling your Smart Contract Address](https://www.youtube.com/watch?v=56K0FdosZ8g)\n- [From Solidity to byte code](https://www.youtube.com/watch?v=RxL_1AfV7N4)\n\n# Lesson 15: NextJS NFT Marketplace (If you finish this lesson, you are a full-stack MONSTER!)\n\n_[⌨️ (23:37:03) Lesson 15: NextJS NFT Marketplace (Full Stack / Front End)](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=85023s)_\n\n## Large Update, please read\n\nMoralis has recently updated to a self-hosted server over their own server. For this, you can do one of the following:\n\n- [Learn how to run one yourself](https://www.youtube.com/watch?v=9GtysZs-FrA)\n- Follow along to learn the concepts of this more interactive app, without actually coding along\n- Skip to the section where we interact with the graph\n\nTL;DR: TheGraph code should work exactly the same as the video, however the Moralis code will not.\n\n💻 Code:\n\n- Backend (Contracts): https://github.com/PatrickAlphaC/hardhat-nft-marketplace-fcc\n- Frontend (Moralis Indexer): https://github.com/PatrickAlphaC/nextjs-nft-marketplace-moralis-fcc\n- Frontend (TheGraph Indexer): https://github.com/PatrickAlphaC/nextjs-nft-marketplace-thegraph-fcc\n  - The Graph: https://github.com/PatrickAlphaC/graph-nft-marketplace-fcc\n\nSpecial thanks to [Matt Durkin](https://twitter.com/mdurkin92) for help with this section.\n\n## Introduction\n\n- [Opensea](https://opensea.io/)\n- [Artion](https://github.com/Fantom-foundation/Artion-Contracts)\n\n## Part I: NFT Marketplace Contracts\n\n### Hardhat Setup\n\n### NftMarketplace.sol\n\n- [Pull Over Push](https://fravoll.github.io/solidity-patterns/pull_over_push.html)\n\n## Reentrancy\n\n- [Reentrancy](https://solidity-by-example.org/hacks/re-entrancy)\n- [Rekt.news](https://rekt.news/leaderboard/)\n- [Openzeppelin NonReentrant](https://docs.openzeppelin.com/contracts/4.x/api/security#ReentrancyGuard)\n\n### NftMarketplace.sol - Continued\n\n### NftMarketplace.sol - Deploy Script\n\n### NftMarketplace.sol - Tests\n\n### NftMarketplace.sol - Scripts\n\n## Part II: Moralis Front End\n\n### What is Moralis?\n\n- [Special Guest Ivan Liljeqvist](https://twitter.com/IvanOnTech)\n\n### NextJS Setup\n\n- [Link NextJS](https://nextjs.org/docs/api-reference/next/link)\n\n### Adding Tailwind\n\n- [Tailwind with NextJS](https://tailwindcss.com/docs/guides/nextjs)\n\n### Introduction to Indexing in Web3\n\n- [TheGraph](https://thegraph.com/en/)\n- [Moralis](https://moralis.io/)\n\n### Connecting Moralis to our Local Hardhat Node\n\n- [NextJS Environment Variables](https://nextjs.org/docs/basic-features/environment-variables)\n- [Reverse Proxy FRP](https://github.com/fatedier/frp/releases)\n  - [Docs](https://docs.moralis.io/moralis-dapp/web3/setting-up-ganache)\n  - [Trouble Shooting](https://docs.moralis.io/faq#frpc)\n- [Moralis Forum](https://forum.moralis.io/)\n- [Moralis Admin CLI](https://docs.moralis.io/moralis-dapp/tools/moralis-admin-cli)\n\n### Moralis Event Sync\n\n- [Moralis Add Event Sync From Code](https://docs.moralis.io/moralis-dapp/connect-the-sdk/connect-using-node#add-new-event-sync-from-code)\n\n#### Reset Local Chain\n\n### Moralis Cloud Functions\n\n- [Moralis Cloud Functions](https://docs.moralis.io/moralis-dapp/cloud-code/cloud-functions)\n- [Moralis Logging](https://docs.moralis.io/moralis-dapp/tools/moralis-admin-cli#get-logs)\n- [Hardhat Network Reference](https://hardhat.org/hardhat-network/reference/)\n- Moralis Database only confirms a transaction with a block confirmation - so we need to move blocks on our hardhat local node.\n- [Moralis Triggers](https://docs.moralis.io/moralis-dapp/cloud-code/triggers)\n\n#### Practice Resetting the Local Chain\n\n### Moralis Cloud Functions II\n\n### Querying the Moralis Database\n\n- [Moralis Queries](https://docs.moralis.io/moralis-dapp/database/queries)\n\n### Rendering the NFT Images\n\n- [useNFTBalance](https://github.com/MoralisWeb3/react-moralis#usenftbalances)\n- [fetch](https://www.npmjs.com/package/node-fetch)\n- [next/image](https://nextjs.org/docs/api-reference/next/image#loader-configuration)\n\n### Update Listing Modal\n\n### Buy NFT Listing\n\n### Listing NFTs for Sale\n\n- [web3uikit Form](https://web3uikit.com/)\n\n## Part III: TheGraph Front End\n\n### Introduction\n\n### What is The Graph?\n\n- [Special Guest Nader Dabit](https://twitter.com/dabit3)\n\n### Building a Subgraph\n\n- [Example Subgraphs](https://thegraph.com/explorer/)\n- [The Graph Studio](https://thegraph.com/studio/)\n- [GraphQL VSCode Extension](https://marketplace.visualstudio.com/items?itemName=GraphQL.vscode-graphql)\n- [GraphQL](https://graphql.org/)\n\n### Deploying our Subgraph\n\n- [GraphQL Queries](https://www.tutorialspoint.com/graphql/graphql_query.htm)\n\n### Reading from The Graph\n\n- [@apollo/client](https://www.npmjs.com/package/@apollo/client)\n- [gql](https://www.npmjs.com/package/gql)\n- [The Graph Docs](https://thegraph.com/docs/en/)\n\n### Hosting our Dapp\n\n🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed Front End Basics! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊\n\n# Lesson 16: Hardhat Upgrades\n\n_[⌨️ (28:53:11) Lesson 16: Hardhat Upgrades](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=103991s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-upgrades-fcc\n\n## Upgradable Smart Contracts Overview\n\n- [Optional Video](https://www.youtube.com/watch?v=bdXJmWajZRY)\n- [Links from Video]\n\n## Types of Upgrades\n\n1.  Parameter\n2.  Social Migrate\n3.  Proxy\n    1.  Proxy Gotchas\n        1. [Function Collisions](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/#diamonds)\n        2. [Storage Collisions](https://blog.openzeppelin.com/the-state-of-smart-contract-upgrades/#diamonds)\n    2.  [Metamorphic Upgrades](https://github.com/PatrickAlphaC/hardhat-metamorphic-upgrades-fcc)\n    3.  [Transparent](https://blog.openzeppelin.com/the-transparent-proxy-pattern/)\n    4.  [UUPS](https://forum.openzeppelin.com/t/uups-proxies-tutorial-solidity-javascript/7786)\n    5.  [Diamond](https://eips.ethereum.org/EIPS/eip-2535)\n\n## Delegatecall\n\n- [delegatecall (solidity-by-example)](https://solidity-by-example.org/delegatecall)\n- [Yul](https://docs.soliditylang.org/en/latest/yul.html)\n\n## Small Proxy Example\n\n- [EIP 1967](https://eips.ethereum.org/EIPS/eip-1967)\n\n## Transparent Upgradable Smart Contract\n\n- [Hardhat-deploy Proxies](https://github.com/wighawag/hardhat-deploy#deploying-and-upgrading-proxies)\n- [Openzeppelin Upgrades Plugin](https://docs.openzeppelin.com/upgrades-plugins/1.x/)\n  - [Openzeppelin upgrades tutorial](https://forum.openzeppelin.com/t/openzeppelin-upgrades-step-by-step-tutorial-for-hardhat/3580)\n- [hardhat deploy upgrades examples](https://github.com/wighawag/template-ethereum-contracts/tree/examples/openzeppelin-proxies/deploy)\n\n# Lesson 17: Hardhat DAOs\n\n_[⌨️ (29:45:24) Lesson 17: Hardhat DAOs](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=107124s)_\n\n⬆️ Up-to-date code: https://github.com/PatrickAlphaC/dao-template\n\n💻 Code from video: https://github.com/PatrickAlphaC/hardhat-dao-fcc\n\n## Introduction\n\n## What is a DAO?\n\n- [What is a DAO?](https://www.youtube.com/watch?v=X_QKZzd68ro)\n\n## How to build a DAO\n\n- [How to build a DAO](https://www.youtube.com/watch?v=AhJtmUqhAqg)\n- That's Patrick\n- [PY Code](https://github.com/brownie-mix/dao-mix)\n- [Python Video](https://www.youtube.com/watch?v=rD8AxZ_wBA4)\n- [Openzeppelin Governance](https://docs.openzeppelin.com/contracts/4.x/api/governance)\n- [Compound Governance](https://compound.finance/governance)\n- [Contract Wizard](https://docs.openzeppelin.com/contracts/4.x/wizard)\n- [CastVoteBySig](https://forum.openzeppelin.com/t/what-is-votecastbysig/17069/2)\n\n# Lesson 18: Security \u0026 Auditing\n\n_[⌨️ (31:28:32) Lesson 18: Security \u0026 Auditing ](https://www.youtube.com/watch?v=gyMwXuJrbJQ\u0026t=113312s)_\n\n💻 Code: https://github.com/PatrickAlphaC/hardhat-security-fcc\n\n## Introduction\n\n- [Readiness Guide](https://learn.openzeppelin.com/security-audits/readiness-guide)\n\n## Slither\n\n- [Install python](https://www.python.org/downloads/)\n- [Slither](https://github.com/crytic/slither#how-to-install)\n- [solc-select](https://github.com/crytic/solc-select)\n- [Fuzz testing](https://en.wikipedia.org/wiki/Fuzzing)\n\n## Fuzzing and Eth Security Toolbox\n\n- [Echidna](https://github.com/crytic/echidna)\n- [Docker Install](https://docs.docker.com/get-docker/)\n- [Eth-Security-ToolBox](https://github.com/trailofbits/eth-security-toolbox)\n\n## Closing Thoughts\n\n- [Best Practices](https://consensys.github.io/smart-contract-best-practices/)\n- [Attacks](https://consensys.github.io/smart-contract-best-practices/attacks/)\n  - [Oracle Attacks](https://hackernoon.com/how-dollar100m-got-stolen-from-defi-in-2021-price-oracle-manipulation-and-flash-loan-attacks-explained-3n6q33r1)\n  - [Re-entrancy Attacks](https://quantstamp.com/blog/what-is-a-re-entrancy-attack)\n- [Damn Vulnerable Defi](https://www.damnvulnerabledefi.xyz/)\n- [Ethernaut](https://ethernaut.openzeppelin.com/)\n- Some Auditors:\n  - [OpenZeppelin](https://openzeppelin.com/)\n  - [SigmaPrime](https://sigmaprime.io/)\n  - [Trail of Bits](https://www.trailofbits.com/)\n\n# Congratulations\n\n🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed The Course! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊\n\n## Where do I go now?\n\n### Learning More\n\n- [CryptoZombies](https://cryptozombies.io/)\n- [Patrick Collins](https://www.youtube.com/channel/UCn-3f8tw_E1jZvhuHatROwA)\n- [Dapp University](https://www.youtube.com/channel/UCY0xL8V6NzzFcwzHCgB8orQ)\n- [ChainShot](https://www.chainshot.com/courses)\n- [Cami Ramos Garzon](https://twitter.com/camiinthisthang)\n- [Albert Hu](https://twitter.com/thatguyintech)\n- [Ivan Liljeqvist](https://twitter.com/IvanOnTech)\n- [Ally Haire](https://twitter.com/DeveloperAlly)\n- [Stephen Fluin](https://twitter.com/stephenfluin)\n- [Eat the Blocks](https://www.youtube.com/channel/UCZM8XQjNOyG2ElPpEUtNasA)\n- [Austin Griffith](https://www.youtube.com/channel/UC_HI2i2peo1A-STdG22GFsA)\n- [Nader Dabit](https://www.youtube.com/user/boyindasouth)\n- [Ethereum.org](https://ethereum.org/en/)\n\n### Community\n\n- [Twitter](https://twitter.com/PatrickAlphaC)\n- [Hardhat Discord](https://hardhat.org/discord)\n- [Ethereum Python Community Discord](https://discord.gg/9zk7snTfWe)\n- [Chainlink Discord](https://discord.gg/2YHSAey)\n- [Ethereum Discord](https://ethereum.org/en/)\n- [Reddit ethdev](https://www.reddit.com/r/ethdev/)\n\n### Hackathons\n\n- [CL Hackathon](https://chain.link/hackathon)\n- [ETHGlobal](https://ethglobal.com/)\n- [ETHIndia](https://ethindia.co/)\n\nBe sure to check out project grant programs!\n\nAnd make today an amazing day!\n\n# Thank you\n\nThanks to everyone who is taking, participating in, and working on this course. It's been a passion project and a data dump of everything I've learnt in the web3 space to get you up to speed quickly. Also, a big thank you to Chainlink Labs for encouraging this course to come to light-and to the many Chainlink Labs team members who helped with various assets!\n\n[![Patrick Collins Twitter](https://img.shields.io/badge/Twitter-1DA1F2?style=for-the-badge\u0026logo=twitter\u0026logoColor=white)](https://twitter.com/PatrickAlphaC)\n[![Patrick Collins YouTube](https://img.shields.io/badge/YouTube-FF0000?style=for-the-badge\u0026logo=youtube\u0026logoColor=white)](https://www.youtube.com/channel/UCn-3f8tw_E1jZvhuHatROwA)\n[![Patrick Collins Linkedin](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/patrickalphac/)\n[![Patrick Collins Medium](https://img.shields.io/badge/Medium-000000?style=for-the-badge\u0026logo=medium\u0026logoColor=white)](https://medium.com/@patrick.collins_58673/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmartcontractkit%2Ffull-blockchain-solidity-course-js","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsmartcontractkit%2Ffull-blockchain-solidity-course-js","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsmartcontractkit%2Ffull-blockchain-solidity-course-js/lists"}