Entire course and video content updated June 15, 2024
Blockchain Developer, Smart Contract, & Solidity Career Path - Powered By AI - Beginner to Expert Course
| Foundry Edition 2024 |
Learn smart contract development, and level up your career
Welcome to the repository for the Blockchain Developer, Smart Contract, & Solidity Cyfrin Updraft - Career Path
| Powered By AI |
| Beginner to Expert Path |
| Foundry Edition 2024 |
This repository houses course resources and discussions for the course.
Please refer to this for an in-depth explanation of the content:
- Website - Join Cyfrin Updraft and enjoy 50+ hours of smart contract development courses
- Twitter - Stay updated with the latest course releases
- LinkedIn - Add Updraft to your learning experiences
- Discord - Join a community of 3000+ developers and auditors
- Newsletter - Weekly security research tips and resources to level up your career
- Codehawks - Smart contracts auditing competitions to help secure web3
Cyfrin Updraft Courses:
- Cyfrin Updraft - Blockchain basics
- Cyfrin Updraft - Solidity basics
- Cyfrin Updraft - Foundry Fundamentals
- Cyfrin Updraft - Advanced Foundry
All the sections on this repo are for several courses on the Solidity Developer Career path of Cyfrin Updraft.
Resources
Solidity 101 Section 3: Remix Fund Me
- Introduction
- Setup
- Sending ETH through a function
- Reverts
- Getting real world price data (Chainlink)
- Quick recap I
- Interfaces
- AI Help III
- Importing from NPM / GitHub
- Getting Prices from Chainlink
- More solidity math
- msg.sender
- Quick recap II
- Library
- SafeMath
- For Loop
- Resetting an array
- Transfer, Send, and Call
- Constructor
- Modifiers
- Testnet Demo
- Advanced Solidity
- Section 4 Recap
Foundry Fundamentals Section 1: Foundry Simple Storage
- Introduction
- Installation & Setup (MacOS & Linux)
- Local Development Introduction
- Foundry Install
- VSCode Setup II
- Foundry Setup
- Formatting Solidity in VSCode
- Compiling in Foundry
- Deploying to a local chain I (Anvil or Ganache)
- Adding another network to metamask
- Deploying to a local chain II (Forge Create)
- Private Key Rant I
- Deploying to a local chain III (Forge Script)
- What is a transaction (But actually)
- Private Key Rant II
- Can you Encrypt a Private Key -> a keystore in foundry yet??
- ThirdWeb Deploy
- Private Key Rant Summary:
- Cast Send
- Deploying to a testnet or a mainnet
- Verifying a contract the manual way
- Cleaning up the project
- Alchemy and the mempool
- Summary
Foundry Fundamentals Section 2: Foundry Fund Me
- Introduction
- Setup
- Testing Introduction
- Setup Continued
- Tests
- Debugging Tests I
- Advanced Deploy Scripts I
- Forked Tests
- Refactoring I: Testing Deploy Scripts
- Refactoring II: Helper Config
- Refactoring III: Mocking (continued)
- Magic Numbers
- Break time!
- More Cheatcodes
- More Coverage
- Chisel
- Gas: Cheaper Withdraw
- Storage
- Gas: Cheaper Withdraw (continued)
- Interactions.s.sol
- Makefile
- Pushing to GitHub
- Recap
Foundry Fundamentals Section 4: Foundry Smart Contract Lottery
- Introduction
- Raffle.sol Setup
- Solidity Contract Layout
- Custom Errors
- Events
- block.timestamp
- Chainlink VRF
- Implementing Chainlink VRF - Introduction
- Modulo
- Enum
- Resetting an array
- Note on building
- CEI
- Introduction to Chainlink Automation
- Implementing Chainlink Keepers - checkUpkeep
- Implementing Chainlink Keepers - checkUpkeep continued
- Implementing Chainlink Keepers - performUpkeep
- Mid-Section Recap
- Tests & Deploy Script Setup
- Tests & Deploy Script Continued
- Lots of Tests
- Create Subscription Script
- Create Subscription from the UI
- Fund Subscription Script
- Add Consumer Script
- More Tests
- PerformUpkeep Tests
- Getting Event Data into Foundry Scripts
- Intro to Fuzz tests
- One Big Test
- Passing the private key to vm.startBroadcast
- Integrations Test
- Testnet Demo - Makefile setup
- Testnet Demo - The Demo
- Console.log Debugging
- forge test --debug
- Recap
Advanced Foundry Section 2: Foundry NFTs | MoodNFT
- Introduction
- What is an NFT?
- Foundry Setup
- IPFS
- Using IPFS
- Basic NFT: Deploy Script
- Basic NFT: Tests
- Basic NFT: Interactions
- Basic NFT: Testnet Demo
- The issue with IPFS & HTTPS TokenURI NFTs
- What is an SVG?
- SVG NFT: Introduction
- SVG NFT: Encoding the NFT
- SVG NFT: Flipping the mood
- SVG NFT: Deploy Script
- SVG NFT: Debugging practice & some notes
- SVG NFT: Anvil Demo
- Advanced: EVM Opcodes, Encoding, and Calling
- Verifying Metamask Transactions
- Filecoin & Arweave
- Section 11 Recap
Advanced Foundry Section 3: Foundry DeFi | Stablecoin (The PINNACLE PROJECT!! GET HERE!)
- What is DeFi?
- Code Walkthrough
- What is a stablecoin (But actually)
- DecentralizedStableCoin.sol
- DSCEngine.sol Setup
- Deposit Collateral
- Mint DSC
- Testing while developing
- depositCollateralAndMintDsc
- redeemCollateral
- Liquidate
- Leveling up your testing skillz
- Fuzz (Invariant) Testing
- Open-based Fuzz tests
- Handler-based Fuzz tests
- Price Feed Handling
- OracleLib
- Note on audit preparedness
- Recap
- Lens Protocol
Advanced Foundry Section 4: Foundry Merkle Airdrop and Signatures
- Introduction to Merkle Airdrops and Code Walkthrough
- Project Setup
- Merkle Proofs
- Base Airdrop Contract
- Already Claimed Check
- Merkle Tree Scripts
- Writing the Tests
- Deployment Script
- Adding Signature Verification
- Signature Standards
- ECDSA Signatures
- Transaction Types Introduction
- Transaction Types
- Blob Transactions
- Type 113 Transactions
- Implementing Signatures
- Modifying the Tests
- Test on ZKsync (optional)
- Create Claiming Script
- Creating a Signature
- Splitting a Signature
- Executing the Anvil Script
- Deploy and Claim on ZKsync Local Node
- Deploy and Claim on ZKsync Sepolia
- Summary
- Recommended Testnet: Sepolia
- Recommended DevOps: foundry-devops
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.
- Main (Sepolia): Sepolia GCP Faucet
- Alchemy Faucet (Sepolia): https://sepoliafaucet.com/
- Infura Faucet (Sepolia): https://www.infura.io/faucet/sepolia
- Chainlink Faucet (Sepolia): https://faucets.chain.link/sepolia
- No need for 0.001 ETH on mainnet
- ZKsync Faucets (ZKsync Sepolia): https://docs.zksync.io/build/tooling/network-faucets.html
- ZKsync Bridge: https://portal.zksync.io/bridge/
⚠️ 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.
- AI Frens
- claude.ai
- cursor IDE
- ChatGPT
- Phind
- Like ChatGPT, but it searches the web
- Gemini
- Other AI extensions
- Github Discussions
- Ask questions and chat about the course here!
- Stack Exchange Ethereum
- Great place for asking technical questions about Ethereum
- Peeranha
- Decentralized Stack Exchange!
- Cookbook
- A smart contract registry and co-pilot
These are 100% optional to do.
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.
IF YOU DECIDE TO MINT THE REAL NFT:
- 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)
- In fact... Get good at interacting with wallets from a burner wallet
- Read my Tweet thread on basic wallet safety
- It might be a good idea to wait till later in the course when we teach you about verifying metamask transactions.
- Feel free to mint NFTs on sepolia without worrying about the above
- The process for bridging looks like the following:
- Send ETH -> one of your wallets like:
- Use the ZKsync Bridge
- Follow the repository: While going through the course be 100% certain to follow along with the github repository. If you run into an issue check the chronological-updates in the repo.
- 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 :)
- Learn at your own pace: It doesn't matter if it takes you a day, a week, a month or even a year. Progress >>> Perfection
- Take Breaks: You will exhaust your mind and recall less if you go all out and watch the entire course in one sitting. Suggested Strategy every 25 minutes take a 5 min break, and every 2 hours take a longer 30 min break
- Refer to Documentation: Things are constantly being updated, so whenever Patrick opens up some documentation, open it on your end and maybe even have the code sample next to you.
- Use ChatGPT and/or the course chat
(back to top) ⬆️
The Blockchain Basics has it's own GitHub repository (aka, codebase). You can find it here: https://github.com/Cyfrin/blockchain-basics-cu?tab=readme-ov-file
💻 Code: https://github.com/cyfrin/remix-simple-storage-cu
⭐️ Welcome to Remix - Simple Storage
⌨️ Setting Up Your First Contract
- Versioning
- Take notes in your code!
- What is a software license
- SPDX License
- Compiling
- Contract Declaration
- Types & Declaring Variables
uint256
,int256
,bool
,string
,address
,bytes32
- Solidity Types
- Bits and Bytes
- Default Initializations
- Comments
- Functions
- Deploying a Contract
- Smart Contracts have addresses just like our wallets
- Calling a public state-changing Function
- Visibility
- Gas III | An example
- Scope
- View & Pure Functions
⌨️ Basic Solidity Arrays & Structs
- Structs
- Intro to Storage
- Arrays
- Dynamic & Fixed Sized
push
array function
⌨️ Basic Solidity Errors & Warnings
- Yellow: Warnings are Ok
- Red: Errors are not Ok
⌨️ Basic Solidity Memory, Storage, & Calldata (Intro)
- 6 Places you can store and access data
- calldata
- memory
- storage
- code
- logs
- stack
⌨️ Deploying your First Contract
- A testnet or mainnet
- Connecting Metamask
- Find faucets here!
- See the faucets at the top of this readme!
- Interacting with Deployed Contracts
- ZKsync compiler edition: 0.8.24
⌨️ The EVM & A Recap of Section 2
- The EVM
(back to top) ⬆️
💻 Code: https://github.com/cyfrin/remix-storage-factory-cu
⭐️ Section 2 | Storage Factory
⌨️ Importing Contracts into other Contracts
⌨️ Interacting with other contracts
- To interact, you always need: ABI + Address
- ABI
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/remix-fund-me-cu
⌨️ Sending ETH through a function
- Ethereum Unit Converter
- Fields in a Transaction
- More on v,r,s
- payable
- msg.value & Other global keywords
- require
- revert
⌨️ Getting real world price data (Chainlink)
- What is a blockchain oracle?
- What is the oracle problem?
- Chainlink
- Chainlink Price Feeds (Data Feeds)
- Chainlink VRF
- Chainlink Keepers
- Chainlink API Calls
- Importing Tokens into your Metamask
- Request and Receive Chainlink Model
- For reference - ChainLink Interface's Repo
⌨️ Importing from NPM / GitHub
⌨️ Getting Prices from Chainlink
- Multiply before you divide
- tuple
- Floating Point Numbers in Solidity
- Type Casting
- Gas Estimation Failed
- Someone should make an article explaining this error
- msg.sender
- named mappings
- For Loop
/* */
is another way to make comments
- Immutable
- Constant
- Current ETH Gas Prices
- Don't stress about gas optimizations! (yet)
- Naming Conventions
⌨️ Receive & Fallback Functions
(back to top) ⬆️
DO NOT SKIP THIS!!
- It's a good idea to ask your AI buddy to format your questions in markdown *
- Special Guest Austin
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/foundry-simple-storage-cu
⭐️ Foundry Simple Storage Introduction
⌨️ Installation & Setup (MacOS & Linux)
- Special Guest Vasiliy
- WSL
- When working in WSL, use Linux commands instead of Windows commands
- TroubleShooting
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash
⚠️ Please use Gitpod as an absolute last resort
- Gitpod
- If using this, NEVER share a private key with real money on Gitpod
- Ideally you figure out the MacOS, Linux, or Windows install though
CMD + K
orCTRL + K
clears the terminalcode .
to open VSCode in a new VSCode window
- CoPilot
- Copilot labs
- Hardhat Solidity Extension
- VSCodium
mkdir foundry-cu
cd foundry-cu
mkdir foundry-simple-storage-cu
⌨️ Foundry Setup ⌨️ Foundry Setup II (WSL)
- FreeCodeCamp Bash
⌨️ Formatting Solidity in VSCode
- Format your solidity code within your
settings.json
"[solidity]": {
"editor.defaultFormatter": "NomicFoundation.hardhat-solidity"
},
"[javascript]":{
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
⌨️ Deploying to a local chain I (Anvil or Ganache)
⌨️ Adding another network to Metamask
⌨️ Deploying to a local chain II (Forge Create)
- 2 Ways to deploy:
-
forge create
-
forge script
-
history -c
⌨️ Deploying to a local chain III (Forge Script)
⌨️ What is a transaction (But actually)
cast --to-base 0x01 dec
cast send
source .env
Can you Encrypt a Private Key -> a keystore in foundry yet??
- A:
NoYes, try the new feature by
cast wallet import your-account-name --interactive
Enter private key:
Enter password:
`your-account-name` keystore was saved successfully. Address: address-corresponding-to-private-key
forge script <script> --rpc-url <rpc_url> --account <account_name> --sender <address> --broadcast
Private Key Rant Summary
Summary:
When you look to deploy
with real money, you should use either:
1. A password encrypted keystore
2. Something like thirdweb deploy
The idea is you never want to have
your private key or password
ANYWHERE written in plain text
(Aka, you always want it encrypted)
⌨️ Deploying to a testnet Sepolia
⌨️ Verifying a contract the manual way
forge fmt
README.md
- ⌨️ Foundry ZKsync
- ⌨️ Compiling Foundry ZKsync
- ⌨️ ZKsync Local Node
- ⌨️ ZKsync Local Deploy
- ⌨️ Tx Types
- ⌨️ Why L2
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/foundry-fund-me-cu
- Chainlink Brownie Contracts Github Repo
forge install smartcontractkit/[email protected] --no-commit
- Dependencies
- remappings
- Chainlink Brownie Contracts
- The test option
-m
regex is deprecated. Please use--match-test
or--mt
instead.
forge test -m testPriceFeedVersionIsAccurate -vvv
is deprecated. Please use
forge test --match-test testPriceFeedVersionIsAccurate -vvv
- 4 types of testing:
1. Unit: Testing a single function
2. Integration: Testing multiple functions
3. Forked: Testing on a forked network
4. Staging: Testing on a live network (testnet or mainnet)
⌨️ Refactoring I: Testing Deploy Scripts
⌨️ Refactoring II: Helper Config
- block.chainid
- Chain ID List
- 11155111 is ETH Sepolia
- 1 is ETH Mainnet
- Mocking
- Chainlink Github
- Multiple Versions of Solidity
⌨️ Refactoring III: Mocking (continued)
- State tree testing
- Arrange, Act, Assert
- hoax
- uint160 -> address
- vm.startPrank
- Gas Reporter
forge snapshot
vm.txGasPrice
gasLeft()
tx.getprice
- ** Advanced **
- Storage Layout
- Purpose of the memory keyword
cast storage
- Opcodes
- Opcodes by Gas
- Opcodes by Gas
- Append
s_
to storage variables - Append
i_
to immutable variables - Caps lock and underscore constant variables
- Chainlink Solidity Style Guide
⌨️ Gas: Cheaper Withdraw (continued)
- Add these to your
.gitignore
.env
lib/
broadcast/
- Git Docs
- GitHub docs
- Github Quickstart
- What is Git?
- The quickstart that we follow in the video
- Learn about git and GitHub
⌨️ (2:34:56) | Tweet Me (add your repo in)!
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/html-fund-me-cu
⌨️ How Metamask works with your browser
⌨️ Introduction to function selectors
- IPFS hash for website - ipfs://QmdCBj5B188qzXgG1LUCD6aKe6RJHqbSgu7YfPyncDirzh
(back to top) ⬆️
⭐️ Section 4: Smart Contract Lottery
💻 Code: https://github.com/Cyfrin/foundry-smart-contract-lottery-cu
- Raffle.sol Setup
// Layout of Contract:
// version
// imports
// errors
// interfaces, libraries, contracts
// Type declarations
// State variables
// Events
// Modifiers
// Functions
// Layout of Functions:
// constructor
// receive function (if exists)
// fallback function (if exists)
// external
// public
// internal
// private
// internal & private view & pure functions
// external & public view & pure functions
- Custom Errors in Solidity
- Introduction to Events
- Events & Logging Video
- Events & Logging in Hardhat
- Introduction to Chainlink VRF
- Special Guest Richard
- Chainlink VRFv2 Docs
- Chainlink VRFv2 Walkthrough
- Chainlink Contracts
⌨️ Implementing Chainlink VRF - Introduction
- Implementing Chainlink VRF
forge install smartcontractkit/[email protected] --no-commit
- Modulo
⌨️ CEI (Checks, Effects, Interactions)
⌨️ Introduction to Chainlink Automation
- Chainlink Automation Docs
- Chainlink Automation Walkthrough
⌨️ Implementing Chainlink Keepers - checkUpkeep
- Enum
- block.timestamp
⌨️ Tests & Deploy Script Setup
⌨️ Mock Chainlink VRF Coordinator
⌨️ Tests & Deploy Script Continued
⌨️ Create Subscription from the UI
forge coverage --report debug
- Expecting Custom Errors
⌨️ Getting Event Data into Foundry Scripts
vm.recordLogs
⌨️ Passing the private key to vm.startBroadcast
- Chainlink VRF: 2 LINK
- Chainlink Keepers: 8 LINK
(back to top) ⬆️
🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊
🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊
💻 Code: https://github.com/Cyfrin/foundry-erc20-cu
- What is an EIP?
- EIPs codebase
- Video (using brownie/python)
- EIP-20
- ERC-677
- EIP-777
⌨️ Manually Creating an ERC20 Token
.github
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/foundry-nft-cu
- Video
- Optional: All on Chain SVG NFT
- EIP-721
- TokenURI
- Pudgy Penguin Example
- Comparing strings in solidity
chisel
⌨️ The issue with IPFS & HTTPS TokenURI NFTs
⌨️ SVG NFT: Debugging practice & some notes
⌨️ Advanced: EVM Opcodes, Encoding, and Calling
- abi.encode
- abi.encodePacked Thanks to Alex Roan for his help on this session!
- Example Contract Creation Transaction What REALLY is the ABI?
- EVM Opcodes
- More EVM Opcodes
- Solidity Cheatsheet
- abi.encode vs abi.encodePacked
⌨️ Introduction to Encoding Function Calls Directly
⌨️ Introduction to Encoding Function Calls Recap
⌨️ Encoding Function Calls Directly
- Function Selector
- Function Signature
⌨️ Verifying Metamask Transactions
- Check the address
- Check the function selector
- Decode the calldata
⌨️ (10:36:31) | Section 2 Recap
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/foundry-defi-stablecoin-cu
⭐️ Section 3: DeFi Stablecoins
- What is DeFi?
- DefiLlama
- Bankless
- MEV
- Aave
- My Previous Aave Video on Shorting Assets
- DAI
- Uniswap
- Maximal Extractable Value (MEV)
⌨️ What is a stablecoin (But actually)
⌨️ DecentralizedStableCoin.sol
- Other DeFi Examples:
⌨️ Getting the value of our collateral
⌨️ depositCollateralAndMintDsc
⌨️ Leveling up your testing skillz
⌨️ Create the collateral redeemal handler
⌨️ DeFi Handler Deposit Collateral
- Special Guest Nader
- Lens Protocol
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/foundry-merkle-airdrop-cu
⌨️ Adding Signature Verification
⌨️ Transaction Types Introduction
- Type 113 Transactions
- Implementing Signatures
- Modifying the Tests
- Test on ZKsync (optional)
- Create Claiming Script
- Creating a Signature
- Splitting a Signature
- Executing the Anvil Script
- Deploy and Claim on ZKsync Local Node
- Deploy and Claim on ZKsync Sepolia
- Summary
💻 Code: https://github.com/Cyfrin/foundry-upgrades-cu
⭐️ Section 5: Upgradable Contracts & Proxies
- Parameter
- Social Migrate
- Proxy
- UUPS vs Transparent
- Abstract Contracts
(back to top) ⬆️
💻 Code: https://github.com/Cyfrin/minimal-account-abstraction
⌨️ Account Abstraction Introduction
- What is native account abstraction?
- How does ZKsync do account abstraction?
- What is EIP-4337?
- What are ZKsync system contracts?
⌨️ Etheren Account Abstraction
⌨️ Get Unsigened PackedUserOperation
⌨️ ZKsync Transaction Simulations
⌨️ executeTransactionFromOutside
Plutocracy is bad! Don't default to ERC20 token voting!!
💻 Code: https://github.com/Cyfrin/foundry-dao-cu
⭐️ Section 14 | DAOs & Governance
- What is a DAO?
- Special Guest Juliette
⌨️ DAOs tooling - Special Guest from Aragon
- How to build a DAO
- That's Patrick
- PY Code
- Python Video
⌨️ Creating the Governor Contract
⌨️ Testing the Governor Contract
- Special Guest Harrison
(back to top) ⬆️
Developers 100% should know all about this! Don't leave the course without at least watching this section!
Important
We highly recommend you head over to the end-to-end Cyfrin Updraft Security and Auditing Curriculum.
🖥️ Code: https://github.com/PatrickAlphaC/denver-security
⭐️ Section 6 | Security & Auditing
⌨️ What is a smart contract audit?
⌨️ What tools do security professionals use?
- Common Attacks
- Best Practices
- Attacks
- Damn Vulnerable Defi
- Ethernaut
- Top Smart Contract Auditors
- Some Smart Contract Auditors:
(back to top) ⬆️
🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊 Completed all The Course! 🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊🎊
- Top 10 learning resources
- Patrick Collins
- CryptoZombies
- Alchemy University
- Speed Run Ethereum
- Ethereum.org
Be sure to check out project grant programs!
And make today an amazing day!
(back to top) ⬆️
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.
(back to top) ⬆️
A huge thank you to our sponsors. These are the groups and technologies
(back to top) ⬆️
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!
Cyfrin Updraft content is open-sourced licensed as GPLv3.
(back to top) ⬆️