Home

Awesome

<div align="center"> <h1> Blockchain Developer, Vyper Smart Contract & Python Career Path - Powered By AI - Beginner to Expert Course</h1>

| Moccasin Edition 2025 |

<p align="center"><strong>Learn smart contract development, and level up your career </strong></p>

Stargazers Forks Contributors Issues GPLv3 License

<p align="center"> <br /> <a href="https://cyfrin.io/"> <img src=".github/images/poweredbycyfrinbluehigher.png" width="145" alt=""/></a> <a href="https://updraft.cyfrin.io/courses/moccasin"> <img src=".github/images/coursebadge.png" width="242.3" alt=""/></a> <br /> </p> </div>

This repository houses course resources and discussions for the course.

Please refer to this for an in-depth explanation of the content:

<p align="center"> <a href="https://youtu.be/-1GB6m39-rM?si=rImbgmtZZ0M1HA-0" target="_blank"> <img src="./images/background.jpg" width="750" alt="Python Blockchain Developer, Smart Contract, & Vyper Course - Powered By AI"> </a> </p>

Required Prerequisites

Nice to have:

Table of Contents

All the sections on this repo are for several courses on the Vyper Developer Career path of Cyfrin Updraft.

<details> <summary>Resources</summary> <ol> <li><a href="#required-prerequisites">Required Prerequisites</a></li> <li><a href="#table-of-contents">Table of Contents</a> <ul> <li><a href="#recommended-tools">Recommended Tools</a></li> </ul> </li> <li><a href="#testnet-faucets">Testnet Faucets</a> <ul> <li><a href="#chainlist">Chainlist</a></li> </ul> </li> <li><a href="#resources-for-this-course">Resources For This Course</a></li> <ul> <li><a href="#important-notes-for-zksync">Important Notes for ZKsync</a></li> <li><a href="#bridging-to-zksync">Bridging to ZKsync</a></li> </ul> </li> </ol> </details> <details> <summary>Welcome & Course Introduction</summary> <ol> <li><a href="#welcome-to-the-course-repo">Welcome to the Course Repo</a> <ul> <li><a href="#best-practices">Best Practices</a></li> </ul> </li> <li><a href="#section-0-welcome-to-the-course">Section 0: Welcome to the Course!</a></li> <li><a href="#section-1-blockchain-basics">Section 1: Blockchain Basics</a></li> </ol> </details> <details> <summary>Vyper 101</summary> <ol> <li><a href="#section-1-welcome-to-remix---favorites-list">Section 1: Welcome to Remix - Favorite's List</a> <ul> <li><a href="#-tweet-me-add-your-contract-in">🐸🐦 Tweet Me (add your contract in)!</a></li> <li><a href="#workshop">Workshop</a></li> </ul> </li> <li><a href="#section-2-remix-buy-me-a-coffee">Section 2: Remix Buy Me A Coffee</a> <ul> <li><a href="#workshop-1">Workshop</a></li> </ul> </li> <li><a href="#section-3-ai-prompting-asking-questions-and-researching">Section 3: AI Prompting, Asking Questions, and Researching</a> <ul> <li><a href="#workshop-2">Workshop</a></li> </ul> </li> </ol> </details> <details> <summary>Moccasin Fundamentals</summary> <ol> <li><a href="#section-1-python-crash-course">Section 1: Python Crash Course</a> <ul> <li><a href="#google-collab">Google Collab</a></li> <li><a href="#installation--setup-macos--linux">Installation & Setup (MacOS & Linux)</a></li> <li><a href="#installation--setup-windowswsl">Installation & Setup (Windows/WSL)</a></li> <li><a href="#gitpod-or-codespaces">Gitpod or CodeSpaces</a></li> <li><a href="#install-python-windows-wsllinuxubuntu">Install Python (Windows WSL/Linux/Ubuntu)</a></li> </ul> </li> <li><a href="#local-development-introduction">Local Development Introduction</a> <ul> <li><a href="#workshop-3">Workshop</a></li> <li><a href="#python-in-updraft">Python in Updraft</a></li> </ul> </li> <li><a href="#section-2-web3py-favorites-list">Section 2: Web3.py Favorite's List</a> <ul> <li><a href="#workshop-4">Workshop</a></li> </ul> </li> <li><a href="#section-3-titanoboa-favorites-list">Section 3: Titanoboa Favorite's List</a> <ul> <li><a href="#workshop-5">Workshop</a></li> </ul> </li> <li><a href="#moccasin-version">Moccasin Version</a> <ul> <li><a href="#install-command">Install command</a></li> </ul> </li> <li><a href="#section-4-moccasin-favorites-list">Section 4: Moccasin Favorite's List</a> <ul> <li><a href="#-tweet-me-add-your-contract-in-1">🐸🐦 Tweet Me (add your contract in)!</a></li> <li><a href="#sign-up-for-alchemy">Sign up for Alchemy</a></li> <li><a href="#workshop-6">Workshop</a></li> </ul> </li> <li><a href="#section-5-moccasin-five-more">Section 5: Moccasin Five More</a> <ul> <li><a href="#workshop-7">Workshop</a></li> </ul> </li> <li><a href="#️-section-6-moccasin-buy-me-a-coffee-get-here">⭐️ Section 6: Moccasin Buy Me A Coffee (GET HERE!)</a> <ul> <li><a href="#test-types">Test types</a></li> <li><a href="#workshops">Workshops</a> <ul> <li><a href="#workshop-1">Workshop 1</a></li> <li><a href="#workshop-2">Workshop 2</a></li> </ul> </li> </ul> </li> <li><a href="#section-7-htmljs-buy-me-a-coffee">Section 7: HTML/JS Buy Me A Coffee</a> <ul> <li><a href="#workshop-8">Workshop</a></li> </ul> </li> <li><a href="#section-8-moccasin-erc20">Section 8: Moccasin ERC20</a> <ul> <li><a href="#workshop-9">Workshop</a></li> </ul> </li> <li><a href="#section-9-how-to-get-hired">Section 9: How to get hired</a> <ul> <li><a href="#workshop-10">Workshop</a></li> </ul> </li> </ol> </details> <details> <summary>Advanced Moccasin</summary> <ol> <li><a href="#section-1-moccasin-nfts">Section 1: Moccasin NFTs</a> <ul> <li><a href="#workshop-12">Workshop</a></li> </ul> </li> <li><a href="#section-2-moccasin-defi--algorithmic-trading">Section 2: Moccasin DeFi | Algorithmic Trading</a> <ul> <li><a href="#workshop-13">Workshop</a></li> </ul> </li> <li><a href="#️-section-3-moccasin-defi--stablecoin-get-here">⭐️ Section 3: Moccasin DeFi | Stablecoin (GET HERE!)</a> <ul> <li><a href="#workshop-14">Workshop</a></li> </ul> </li> <li><a href="#section-4-moccasin-signatures">Section 4: Moccasin Signatures</a> <ul> <li><a href="#workshop-15">Workshop</a></li> </ul> </li> <li><a href="#section-5-moccasin-upgrades">Section 5: Moccasin Upgrades</a> <ul> <li><a href="#workshop-16">Workshop</a></li> </ul> </li> </ol> </details> <details> <summary>Course Completion</summary> <ol> <li><a href="#congratulations">Congratulations</a> <ul> <li><a href="#where-do-i-go-now">Where do I go now?</a> <ul> <li><a href="#learning-more">Learning More</a></li> <li><a href="#community">Community</a></li> <li><a href="#hackathons">Hackathons</a></li> </ul> </li> </ul> </li> <li><a href="#disclosures">Disclosures</a></li> <li><a href="#sponsors">Sponsors</a></li> <li><a href="#thank-you">Thank you</a> <ul> <li><a href="#license">License</a></li> </ul> </li> </ol> </details> <!-- - [Required Prerequisites](#required-prerequisites) - [Table of Contents](#table-of-contents) - [Recommended Tools](#recommended-tools) - [Testnet Faucets](#testnet-faucets) - [Chainlist](#chainlist) - [Resources For This Course](#resources-for-this-course) - [Bonus NFTs](#bonus-nfts) - [Important Notes for ZKsync](#important-notes-for-zksync) - [Bridging to ZKsync](#bridging-to-zksync) - [Welcome to the Course Repo](#welcome-to-the-course-repo) - [Best Practices](#best-practices) - [Section 0: Welcome to the Course!](#section-0-welcome-to-the-course) - [Section 1: Blockchain Basics](#section-1-blockchain-basics) - [Vyper 101](#vyper-101) - [Section 1: Welcome to Remix - Favorite's List](#section-1-welcome-to-remix---favorites-list) - [🐸🐦 Tweet Me (add your contract in)!](#-tweet-me-add-your-contract-in) - [Workshop](#workshop) - [Section 2: Remix Buy Me A Coffee](#section-2-remix-buy-me-a-coffee) - [Workshop](#workshop-1) - [Section 3: AI Prompting, Asking Questions, and Researching](#section-3-ai-prompting-asking-questions-and-researching) - [Workshop](#workshop-2) - [Moccasin Fundamentals](#moccasin-fundamentals) - [Section 1: Python Crash Course](#section-1-python-crash-course) - [Google Collab](#google-collab) - [Installation \& Setup (MacOS \& Linux)](#installation--setup-macos--linux) - [Installation \& Setup (Windows/WSL)](#installation--setup-windowswsl) - [Gitpod or CodeSpaces](#gitpod-or-codespaces) - [Install Python (Windows WSL/Linux/Ubuntu)](#install-python-windows-wsllinuxubuntu) - [Local Development Introduction](#local-development-introduction) - [Workshop](#workshop-3) - [Python in Updraft](#python-in-updraft) - [Section 2: Web3.py Favorite's List](#section-2-web3py-favorites-list) - [Workshop](#workshop-4) - [Section 3: Titanoboa Favorite's List](#section-3-titanoboa-favorites-list) - [Workshop](#workshop-5) - [Moccasin Version](#moccasin-version) - [Install command](#install-command) - [Section 4: Moccasin Favorite's List](#section-4-moccasin-favorites-list) - [🐸🐦 Tweet Me (add your contract in)!](#-tweet-me-add-your-contract-in-1) - [Sign up for Alchemy](#sign-up-for-alchemy) - [Workshop](#workshop-6) - [Section 5: Moccasin Five More](#section-5-moccasin-five-more) - [Workshop](#workshop-7) - [⭐️ Section 6: Moccasin Buy Me A Coffee (GET HERE!)](#️-section-6-moccasin-buy-me-a-coffee-get-here) - [Test types](#test-types) - [Workshops](#workshops) - [Workshop 1](#workshop-1) - [Workshop 2](#workshop-2) - [Section 7: HTML/JS Buy Me A Coffee](#section-7-htmljs-buy-me-a-coffee) - [Workshop](#workshop-8) - [Section 8: Moccasin Raffle](#section-8-moccasin-raffle) - [Workshop](#workshop-9) - [Section 9: How to get hired](#section-9-how-to-get-hired) - [Workshop](#workshop-10) - [Advanced Moccasin](#advanced-moccasin) - [Section 1: Moccasin ERC20](#section-1-moccasin-erc20) - [Workshop](#workshop-11) - [Section 2: Moccasin NFTs](#section-2-moccasin-nfts) - [Workshop](#workshop-12) - [Section 3: Moccasin DeFi | Algorithmic Trading](#section-3-moccasin-defi--algorithmic-trading) - [Workshop](#workshop-13) - [⭐️ Section 4: Moccasin DeFi | Stablecoin (GET HERE!)](#️-section-4-moccasin-defi--stablecoin-get-here) - [Workshop](#workshop-14) - [Section 5: Moccasin Signatures](#section-5-moccasin-signatures) - [Workshop](#workshop-15) - [Section 6: Moccasin Upgrades](#section-6-moccasin-upgrades) - [Workshop](#workshop-16) - [Congratulations](#congratulations) - [Where do I go now?](#where-do-i-go-now) - [Learning More](#learning-more) - [Community](#community) - [Hackathons](#hackathons) - [Disclosures](#disclosures) - [Sponsors](#sponsors) - [Thank you](#thank-you) - [License](#license) -->

Recommended Tools

Testnet Faucets

If you receive a flag pop-up requiring you to have 0.001 ETH on mainnet, you may be able to wait 10 to 20 minutes and try again to avoid adding the 0.001 ETH on the mainnet.

⚠️ 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.

Chainlist

Resources For This Course

<!-- # Bonus NFTs These are 100% optional to do. - *Coming soon...* After every section, in this GitHub repo will be a link to a contract on Sepolia or ZKsync. They contain a challenge for you to solve, and in return, you'll be given an AWESOME NFT. ## Important Notes for ZKsync IF YOU DECIDE TO MINT THE REAL NFT: 1. We didn't audit the NFT, so if you want to make sure you'll be safe, interact with the contract using a burner wallet (a wallet with very little money that you don't use for anything else) 1. In fact... Get good at interacting with wallets from a burner wallet 2. Read my [Tweet thread on basic wallet safety](https://twitter.com/PatrickAlphaC/status/1663936101650685954) 3. It might be a good idea to wait till later in the course when we teach you about verifying metamask transactions. 4. Feel free to mint NFTs on sepolia without worrying about the above -->

Bridging to ZKsync

If you want to work with real funds on ZKsync for any challenges that we deploy there, you can follow this list.

Please do not use real funds unless you are confident of what you are doing, especially when it comes to private key safety.

  1. The process for bridging looks like the following:
    1. Buy ETH (On an exchange like Coinbase or Kraken)
  2. Send ETH -> one of your wallets like:
    1. Metamask
    2. Frame
    3. Rainbow
    4. Argent
    5. Coinbase Wallet
  3. Use the ZKsync Bridge

Welcome to the Course Repo

Best Practices

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 0: Welcome to the Course!


Section 1: Blockchain Basics

[!IMPORTANT] Please be sure to go through blockchain basics before coming here! The GitHub repository for that curriculum can be found here:

🐱 GitHub repository : https://github.com/Cyfrin/blockchain-basics-cu

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Vyper 101


Section 1: Welcome to Remix - Favorite's List

πŸ’» Code: https://github.com/Cyfrin/remix-favorites-cu

🐸🐦 Tweet Me (add your contract in)!

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Create a function called add that adds 1 to whatever is in self.favorite_number
  2. Have the starting favorite number different from 7, check to make sure it's the number you set!
  3. (Challenging) Create a new type using the "struct" keyword, and create a function that will save a new variable of that type to a state/storage variable.

Section 2: Remix Buy Me A Coffee

πŸ’» Code: https://github.com/Cyfrin/remix-buy-me-a-coffee-cu

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. (Optional) Get the price of a different asset using Chainlink price feeds on your fake chain
  2. Write a function to get the total amount of funds in the contract
    1. Loop through the array of funders, and how much they've funded!
    2. Try not to just use self.balance!
  3. (Challenging!) Write a function that allows you to change the owner of the contract
    1. Hint: You'll need to make sure OWNER isn't immutable!
<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 3: AI Prompting, Asking Questions, and Researching


No code here!

Workshop

Get a good idea for "how good" your AI is. Maybe shop around for an AI you like. Ask them some softball questions to figure out how smart they are. Like:

  1. Make a minimal vyper contract
  2. What's the difference between a dynamic array and a fixed sized array?
  3. Here is some vyper code:
@external
def add_person(name: String[100], favorite_number: uint256):
    new_person: Person = Person(favorite_number = favorite_number, name = name)
    self.list_of_people[self.list_of_people_index] = new_person
    self.list_of_numbers[self.list_of_people_index] = favorite_number
    self.list_of_people_index += 1
    self.name_to_favorite_number[name] = favorite_number

What does it do?

  1. Is this vyper code safe?
send(OWNER, self.balance)
<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Moccasin Fundamentals


Section 1: Python Crash Course

Python Version: 3.11

Full code: https://github.com/Cyfrin/python-in-updraft-cu

Google Collab

Installation & Setup (MacOS & Linux)

Installation & Setup (Windows/WSL)

⚠️ Please use Gitpod as an absolute last resort

Gitpod or CodeSpaces

Install Python (Windows WSL/Linux/Ubuntu)

To check for python, run:

which python
python --version

which python3
python3 --version

To install a specific version of python:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.11

Local Development Introduction

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

Here is your final project, make a function that takes 2 inputs, the first is a year, and the second is a number of days. The function should print out either:

Y days after Jan 1st, X, it will still be the year X

or

Y days after Jan 1st, X, it will be the year Z

Where:

Examples

The function invocations will look like this:

what_year(1985, 376)

Which should print:

376 days after Jan 1st, 1985, it will be the year 1986

Or

what_year(1985, 200)

Which should print:

200 days after Jan 1st, 1985, it will still be the year 1985

Or

what_year(1985, 1098)

Which should print:

1098 days after Jan 1st, 1985, it will be the year 1988

Notice how "still" is added to the second sentance, but not the first!

Assumptions

  1. Assume a year is 365 days (but, if you're off by a day or two, that's ok)
  2. Don't worry about leap years
  3. Don't use the datetime package!

Python in Updraft

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 2: Web3.py Favorite's List

πŸ’» Code: https://github.com/Cyfrin/web3py-favorites-cu

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

Do one of the following:

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 3: Titanoboa Favorite's List

πŸ’» Code: https://github.com/Cyfrin/boa-favorites-cu

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Create your own contract that you can:
    1. Deploy to your local anvil instance
    2. Call set_bool(boolean) which which change a variable named my_bool to the boolean you pass it
    3. Call get_bool() which will return the value of my_bool
  2. Deploy to your local tenerly network (if you still have the free trial!)

Moccasin Version

0.3.6

Install command

uv tool install 'moccasin==0.3.6' 

Section 4: Moccasin Favorite's List

πŸ’» Code: https://github.com/Cyfrin/mox-favorites-cu

wget -O zkvyper <RELEASE_VERSION>
chmod +x zkvyper
mv zkvyper /usr/local/bin

🐸🐦 Tweet Me (add your contract in)!

Sign up for Alchemy

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Deploy your contract to your tenderly virtual network
  2. Write your own deploy script, and deploy it to the pyevm network
  3. Write your own deploy script, and deploy it to the eravm network
  4. Write a new test in your testfile, and run it!
<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 5: Moccasin Five More

πŸ’» Code: https://github.com/Cyfrin/mox-five-more-cu

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Add a second module to five_more
    1. Initialize it
    2. And call one of the functions from it. For example, in your five_more contract:
    initializes: my_contract
    
    def some_func():
     my_contract.set_bool(True)
    
  2. Try to export functions from 2 different modules
  3. (Challenging) Make a contract that successfully compiles with the uses keyword
  4. (Challenging) Make a contract that uses the contract from #3!
<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

⭐️ Section 6: Moccasin Buy Me A Coffee (GET HERE!)

πŸ’» Code: https://github.com/Cyfrin/mox-buy-me-a-coffee-cu

<div style="display: flex; flex-wrap: wrap; gap: 10px;"> <img src="images/storage/1-storage-start.png" width="24%" alt="Storage Start"> <img src="images/storage/2-booleans.png" width="24%" alt="Booleans"> <img src="./images/storage/3-fixed-arrays.png" width="24%" alt="Fixed Arrays"> <img src="./images/storage/4-dynamic-arrays.png" width="24%" alt="Dynamic Arrays"> </div> <div style="display: flex; flex-wrap: wrap; gap: 10px; margin-top: 10px;"> <img src="./images/storage/5-mappings.png" width="32%" alt="Mappings"> <img src="./images/storage/6-constants-immutables.png" width="32%" alt="Constants Immutables"> <img src="./images/storage/7-memory-vars.png" width="32%" alt="Memory Variables"> </div>

Test types

There are many types of tests:

Workshops

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

Workshop 1

Write a test that:

Workshop 2

  1. Write enough tests to get you over 95% code coverage for buy_me_a_coffee.vy
  2. Sign up for Cyfrin Profiles! (And then tweet at me!)
  3. Push your code up to GitHub
  4. Add a new commit up to your GitHub repo
<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 7: HTML/JS Buy Me A Coffee

πŸ’» Code: https://github.com/Cyfrin/html-fund-me-cu

Workshop

None, Just enjoy the section!

Section 8: Moccasin ERC20

πŸ’» Code: https://github.com/Cyfrin/mox-erc20-cu

We teach how to build minimal ERC20 tokens like WETH, LINK, USDC, and DAI!

Extra Learnings

Workshop 1

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

If you do the stateful fuzzer challenge, 1 hour is ok!

Note

The workshop of the next section is what you should do. DO NOT CONTINUE TO ADVANCED MOCCASIN UNTIL YOU'VE COMPLETED THE WORKSHOP OF SECTION 9! You'll only be cheating yourself.

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Section 9: How to get hired

Steps

  1. Write down your reasons why
  2. Do 1 full course Cyfrin Updraft
    1. Get through Advanced Moccasin
  3. Apply your knowledge and get real experience
    1. Hackathons like ETH Global
    2. Competitive Audits like CodeHawks
    3. Make pull requests to open sourced projects
    4. Build projects and add them to your GitHub
    5. Update your Cyfrin Profile
  4. Apply to jobs, start a company, or freelance
  5. Repeat steps 3 and 4
    1. You should always be learning more by doing more!

Workshop

Spend at most 1 week on this :)

Feel free to use some AI!

Prompt

Build a smart contract lottery/raffle yourself, using minimal AI help. You can build a "weak randomness" lotttery, using on-chain randomness (but just know, it's not secure!). Or go the extra mile and use Chainlink VRF 2.5 to build a secure lottery.

You should:

  1. Have test coverage of over 80% of your lines of code
  2. Have a function called enter_raffle for people to enter your raffle
  3. The raffle should pick 1 winner after X seconds
    1. Have this be a customizable variable
  4. The winner should get the sum of all the entrance fees added by the other participants
  5. Anyone can call a pick_winner or request_winner function, that will randomly select the winner.

Here are some example code bases to help you:


Advanced Moccasin


Section 1: Moccasin NFTs

πŸ’» Code: https://github.com/Cyfrin/mox-nft-cu

Workshop 1

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Upload your own dog image to IPFS, mint it as an NFT, and then see it in your Metamask!
  2. Write tests to get to at least 80% coverage!

Workshop 2

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Deploy your mood NFT to a locally running chain, flip it's mood, and view it in metamask!
  2. Get to 80% test coverage!

Section 2: Moccasin DeFi | Algorithmic Trading

πŸ’» Code: https://github.com/Cyfrin/mox-algorithmic-trading-cu

<p align="center"> <br /> <img src="images/defi.png" width="500" alt=""/></a> </p>

We will rebalance a portfolio using USDC and WETH.

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Copy the code you wrote in your notebook into some scripts
  2. Run your scripts on a Tenderly virtual network, or a forked network
    1. Start with your target allocations not being correct, but then correct them!

⭐️ Section 3: Moccasin DeFi | Stablecoin (GET HERE!)

πŸ’» Code: https://github.com/Cyfrin/mox-stablecoin-cu

You'll learn how to build your own stablecoin! Pick collateral like WETH, WBTC, and USDC to make your own stablecoin! Stablecoins one of the most POWERFUL applications on earth!

Workshop 1

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Get your unit test coverage above 80%!

Workshop 2

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Complete your own fuzz tests!

Workshop 3

  1. Look into the audit report, see if you can spot some issues with this codebase yourself!

Section 4: Moccasin Signatures

πŸ’» Code: https://github.com/Cyfrin/mox-signatures-cu

SubLesson - Signatures

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Deploy to ZKsync (era test node, sepolia, or tenderly ETH virtual network)
  2. Try to make a bigger merkle tree with 8 leaves!

Section 5: Moccasin Upgrades

πŸ’» Code: https://github.com/Cyfrin/mox-upgrades-cu

Workshop

Spend at most 25 minutes on all of these prompts without the aide of AI. If you're unable to solve them after 25 minutes, stop, take a break, and then work with an AI or the discussions to help you solve them. Good luck!

  1. Try to write a contract that has a function selector collision with the proxy
  2. Write a contract where the storage variables change order!

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Congratulations

🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed all The Course! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊

Where do I go now?

Learning More

Community

Hackathons

Be sure to check out project grant programs!

And make today an amazing day!

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Disclosures

Transparency is important! So we want to disclose any potential conflicts that might have affected my judgement so you can pick tools that are right for you. Patrick is co-founder of Alpha Chain, a blockchain infrastructure company. Alpha Chain runs Chainlink, Ethereum, Binance, Polygon, Harmony, Solana, Moonbeam, and Moonriver blockchain services. Alpha Chain often works with Alchemy and receives discounted services. Patrick is the co-founder of Cyfrin, and they do smart contract security & auditing services. Patrick is also the co-founder of Chain Accel, who is an advisor on the Peeranha project.

Because of all this, I have added alternatives to each section where we suggest a tool.

<p align="right">(<a href="#table-of-contents">back to top</a>) ⬆️</p>

Sponsors

A huge thank you to our sponsors. These are the groups and technologies

Thank you

Thanks 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 Cyfrin & Chain Accel for encouraging this course to come to light, and many, many, many people from the community.

And thanks to the Cyfrin team for making this possible!

<a href="https://github.com/cyfrin/moccasin-full-course-cu/graphs/contributors"> <img src="https://contrib.rocks/image?repo=cyfrin/moccasin-full-course-cu" /> </a>

License

Cyfrin Updraft content is open-sourced licensed as GPLv3.

Cyfrin Twitter Cyfrin YouTube Cyfrin LinkedIn

<!-- export MOCCASIN_KEYSTORE_PATH="$HOME/.moccasin/course_keystores" -->