/full-blockchain-solidity-course-py

Ultimate Solidity, Blockchain, and Smart Contract - Beginner to Expert Full Course | Python Edition

MIT LicenseMIT

Big Update: New Rinkeby Faucet Located Here. You can find Backup Faucets here.

Additionally, lesson 7 uses Chainlink VRF v1 instead of v2, you can find the docs for Chainlink VRFv1 here.

YouTube Video


Solidity, Blockchain, and Smart Contract Course – Beginner to Expert Python Tutorial


Welcome to the repository for the Ultimate Solidity, Blockchain, and Smart Contract - Beginner to Expert Full Course | Python Edition FreeCodeCamp course!

Table of Contents

Resources For This Course

Questions

Windows Support

Hiccups/Issues from the Video

Lesson 0: Welcome To Blockchain

What is a Blockchain?

Making Your First Transaction

How Do Blockchains Work?

Consensus

The Future

Miscellaneous

💻 Code: https://github.com/PatrickAlphaC/simple_storage

Everything in this section can be read about in the Solidity Documentation

Basic Solidity

  • Versioning
  • Compiling
  • Contract Declaration
  • Types & Declaring Variables
    • uint256, int256, bool, string, address, bytes32
  • Default Initializations
  • Comments
  • Functions
  • Deploying a Contract
  • Calling a public state-changing Function
  • Visibility
  • Scope
  • View & Pure Functions
  • Structs
  • Intro to Storage
  • Arrays - Dynamic & Fixed sized
  • Compiler Errors and Warnings
  • Memory
  • Mappings
  • SPDX License
  • Recap

Deploying to a "Live" network

  • A testnet or mainnet
  • Find a faucet here
  • Connecting Metamask
  • Interacting with Deployed Contracts
  • The EVM

Lesson 2: Storage Factory

💻 Code: https://github.com/PatrickAlphaC/storage_factory

Inheritance, Factory Pattern, and Interacting with External Contracts

  • Factory Pattern
  • Imports
  • Deploy a Contract From a Contract
  • Interact With a Deployed Contract
  • Recap

Lesson 3: Fund Me

💻 Code: https://github.com/PatrickAlphaC/fund_me

Payable, msg.sender, msg.value, Units of Measure

Chainlink Oracles

Importing from NPM and Advanced Solidity

  • Decimals/Floating Point Numbers in Solidity
  • latestRoundData
  • Importing from NPM in Remix
  • Interfaces
    • Introduction to ABIs
  • Getting Price Feed Addresses
  • getPrice
  • Tuples
    • Unused Tuple Variables
  • Matching Units (WEI/GWEI/ETH)
  • getConversionRate
  • Matching Units (Continued)
  • SafeMath & Integer Overflow
  • Setting a Threshold
  • Require
  • Revert
  • Withdraw Function
  • Transfer
  • Balance
  • this
  • Contract Owners
  • Constructor
  • ==
  • Modifiers
  • Resetting
  • for loop
  • Array Length
  • Forcing a Transaction
  • Recap

💻 Code: https://github.com/PatrickAlphaC/web3_py_simple_storage

Installing VSCode, Python, and Web3

Our First Python Script with Web3.py - Deploying a Contract

Interacting with Our Contract in Python & Web3.py

  • 2 Things you always need
    1. Contract Address
    2. Contract ABI
  • Getting address from transaction receipt
  • Calling a view function with web3.py
    • Call vs Transact
  • Updating State with Web3.py
  • ganache-cli
  • Working with ganache-cli
  • Open a new terminal in the same window
  • Deploying to a testnet
  • Infura
  • Alchemy
  • Using Infura RPC URL / HTTP Provider
  • Chain Ids
  • Wow this seems like a lot of work... Is there a better way?

💻 Code: https://github.com/PatrickAlphaC/brownie_simple_storage

Brownie Introduction

Installing Brownie

Brownie Simple Storage Project

  • A new Brownie project with brownie init
    • Project Basic Explanation
  • Adding SimpleStorage.sol to the contracts folder
  • Compiling with brownie compile
  • Brownie deploy script
    • def main is brownie's entry point
  • brownie defaults to a development ganache chain that it creates
  • Placing functions outside of the main function
  • brownie accounts
    • 3 Ways to Add Accounts
      1. accounts[0]: Brownie's "default" ganache accounts
        • Only works for local ganache
      2. accounts.load("..."): Brownie's encrypted command line (MOST SECURE)
        • Run brownie accounts new <name> and enter your private key and a password
      3. accounts.add(config["wallets"]["from_key"]): Storing Private Keys as an environment variable, and pulling from our brownie-config.yaml
        • You'll need to add dotenv: .env to your brownie-config.yaml and have a .env file
  • Importing a Contract
  • Contract.Deploy
  • View Function Call in Brownie
  • State-Changing Function Call in Brownie / Contract Interaction
  • transaction.wait(1)

Testing Basics

  • test_simple_storage.py
  • Arrange, Act, Assert
  • assert
  • brownie test
  • test_updating_storage
  • Pytest / Brownie Test Tips
  • Deploy to a Testnet
  • brownie networks list
  • Development vs Ethereum
    • Development is temporary
    • Ethereum networks persist
  • RPC URL / HTTP Provider in Brownie
  • The network flag
    • list index out of range
  • get_account()
  • networks.show_active()
  • build/deployments
  • Accessing previous deployments
  • Interacting with contracts deployed in our brownie project

[Brownie console]

  • brownie console

Lesson 6: Brownie Fund Me

💻 Code: https://github.com/PatrickAlphaC/brownie_fund_me

Introduction

  • Setup

Dependencies, Deploying, and Networks

  • Dependencies
  • chainlink-brownie-contracts
  • remappings
  • Deploy Script (V1)
  • helpful_scripts.py
  • __init__.py
  • Deploy to Rinkeby
  • Contract Verification (publish_source)
    • The Manual Way
      • "Flattening"
    • The Programatic Way
    • Interacting with Etherscan
  • Deploying to Local Chains
  • Introduction to Mocking
  • Constructor Parameters
  • networks in our brownie-config.yaml
  • Copying Mock Contracts from chainlink-mix
  • Deploying and using our mock
  • Refactoring
  • Deploying to a persistent ganache
  • brownie attach
  • Adding a persistent brownie network
  • resetting a network build

Funding and Withdrawing Python Scripts

  • Whoops! Let's fix an issue...
  • Fund Script
  • Withdraw Script

Testing across networks

  • test_can_fund_and_withdraw
  • default networks
  • pytest pip install pytest
  • pytest.skip
  • brownie exceptions
  • mainnet-fork
  • Custom mainnet fork
  • Adding a development brownie network
    • brownie networks add development mainnet-fork-dev cmd=ganache-cli host=http://127.0.0.1 fork='https://infura.io/v3/$WEB3_INFURA_PROJECT_ID' accounts=10 mnemonic=brownie port=8545
  • Alchemy
  • brownie test --network mainnet-fork
  • brownie ganache vs local ganache vs mainnet-fork vs testnet...

Git

💻 Code: https://github.com/PatrickAlphaC/smartcontract-lottery

Chainlink VRF v1 docs

Introduction

  • Add a README.md
  • Defining the project
  • Is it decentralized?

Lottery.sol

Testing Lottery.sol

  • deploy_lottery.py
  • get_account() refactored
  • get_contract
    • contract_to_mock
    • Contract.from_abi
  • Adding the parameters to deploying to lottery
  • vrfCoordinatorMock and adding mocks
  • LinkToken and Mocks
  • Successful Ganache Deployment!
  • Python Lottery Scripts/Functions
    • start_lottery
    • Brownie tip: Remember to tx.wait(1) your last transaction
    • enter_lottery
    • end_lottery
  • Funding with LINK
  • brownie interfaces
  • Waiting for callback
  • Integration Tests & Unit Tests
  • Test all lines of code
  • test_get_entrance_fee
  • pytest.skip (again)
  • test_cant_enter_unless_started
  • test_can_start_and_enter_lottery
  • test_can_pick_winner_correctly
  • Events and Logs
  • callBackWithRandomness

Lottery.sol Testnet Deployment

Lesson 8: Chainlink Mix

💻 Code: https://github.com/smartcontractkit/chainlink-mix

💻 Code: https://github.com/PatrickAlphaC/erc20-brownie-py

Lesson 10: Defi & Aave

💻 Code: https://github.com/PatrickAlphaC/aave_brownie_py_freecode

Defi Intro

Aave UI

Testing

Lesson 11: NFTs

💻 Code: https://github.com/PatrickAlphaC/nft-demo

Non-Technical Explainer

Simple NFT

SimpleCollectible Testing

  • What else with NFTs?

Advanced NFT

  • AdvancedCollectible.sol
  • Dungeons and Dragons Example
  • Double Inherited Constructors
  • createCollectible (Advanced)
    • tokenIdToBreed
  • Working with in-flight Chainlink VRF requests
  • Download the NFT images from the nft-mix
  • setTokenURI
    • _isApprovedOrOwner
  • Emit events when you update mappings
  • indexed event keyword

Advanced deploy_and_create

  • Move OPENSEA_URL to helpful_scripts
  • Deploying AdvancedCollectible
    • Opensea testnet is only compatible with Rinkeby
  • Rinkeby Chainlink VRF Contract Addresses
  • Speeding through adding functions from previous projects
  • Deploy to Rinkeby
  • create_collectible.py
  • A quick unit test
  • A quick integration test

Creating Metadata & IPFS

Lesson 12: Upgrades

💻 Code: https://github.com/PatrickAlphaC/upgrades-mix

Introduction to upgrading smart contracts

Upgrades-mix and code

  • Setup
  • Box.sol
  • BoxV2.sol
  • Getting the proxy contracts
  • Openzeppelin Proxy Github
  • 01_deploy_box.py
  • Hooking up a proxy to our implementation contract
  • (Optional) Creating a Gnosis Safe
  • Initializers
  • Encoding Initializer Function
  • Assigning ABI to a proxy
  • Running the script
  • Upgrade Python Function

Testing Upgrades

  • Testing our proxy
  • Testing our upgrades

Upgrades on a testnet

Bonus Lesson 13: Full Stack Defi

💻 Code: https://github.com/PatrickAlphaC/defi-stake-yield-brownie-freecode

  • FreeCodeCamp React
  • What are we building?
  • Setup
  • DappToken.sol
  • TokenFarm.sol
    • tokenIsAllowed
    • addAllowedTokens
    • mapping of a mapping
    • stakeTokens
    • issueTokens
    • getUserTotalValue
    • getUserSingleTokenValue
    • getTokenValue
    • setPriceFeedContract
    • unStakeTokens
    • Can this be reentrancy attacked?

Defi Stake Yield Brownie Scripts & Tests

  • deploy.py
    • Deploying DappToken
    • Deploying TokenFarm
    • Adding allowed tokens
  • ERC20 Kovan Faucet
    • If the link above does not work, you can get another ERC20 token using this faucet: Weenus ERC20 Faucet
  • Mocking our ERC20s

Testing our Defi Stake Yield Brownie Dapp

  • test_set_price_feed_contract
  • test_stake_tokens
  • Fixtures
  • test_issue_tokens
  • Now you try on tests!

Front End / Full Stack

  • Front End Introduction
  • Typescript
  • React
  • useDapp
  • npx
  • yarn
  • create-react-app
    • Layout
  • Testing Front End
  • yarn && yarn start
  • Connecting our wallets
    • Install useDapp
    • Header Component
    • Connect Button
  • Material-UI
  • Making our button nicer
  • Main.tsx
    • Sending brownie-config & build folder to our UI
    • Helper Config
    • TypeScript error suppression
    • Getting addresses
    • Ethers
    • Only support kovan
  • YourWallet
    • supportedTokens
    • State Hooks
    • Showing tokens
    • WalletBalance
    • ethersproject/units
    • BalanceMsg
    • Stake Form
    • Calling approve
    • useContractFunction
    • useEffect
    • Notifications
    • Make it pretty
    • Alerts

Shoutout to Matt for the help on the front end!

Closing and Summary

Security

Where do I go now?

Learning More

Community

Hackathons

Be sure to check out project grant programs!

Vyper

From solidity course to vyper

And make today an amazing day!