# full-blockchain-solidity-course-py **Repository Path**: caoxiaoqicaochensong/full-blockchain-solidity-course-py ## Basic Information - **Project Name**: full-blockchain-solidity-course-py - **Description**: No description available - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-09-16 - **Last Updated**: 2024-09-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README _Big Update_: [New Sepolia Faucet Located Here](https://sepoliafaucet.com/). \Kovan, Ropsten, and Rinkeby have been deprecated. Goerli Still works but we highly recommend Sepolia as its proof of stake based. You'll need to verify via Twitter to get ETH & LINK. You can find [Backup Faucets here](https://docs.chain.link/docs/link-token-contracts/#goerli). Additionally, lesson 7 uses Chainlink VRF v1 instead of v2, [you can find the docs for Chainlink VRFv1 here](https://docs.chain.link/vrf/v1/examples/get-a-random-number). [YouTube Video](https://www.youtube.com/watch?v=M576WGiDBdQ)

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 - [Table of Contents](#table-of-contents) - [Resources For This Course](#resources-for-this-course) - [Questions](#questions) - [Windows Support](#windows-support) - [Hiccups/Issues from the Video](#hiccupsissues-from-the-video) - [Lesson 0: Welcome To Blockchain](#lesson-0-welcome-to-blockchain) - [What is a Blockchain?](#what-is-a-blockchain) - [Making Your First Transaction](#making-your-first-transaction) - [How Do Blockchains Work?](#how-do-blockchains-work) - [Consensus](#consensus) - [The Future](#the-future) - [Miscellaneous](#miscellaneous) - [Lesson 1: Welcome to Remix! Simple Storage](#lesson-1-welcome-to-remix-simple-storage) - [Everything in this section can be read about in the Solidity Documentation](#everything-in-this-section-can-be-read-about-in-the-solidity-documentation) - [Remix](#remix) - [Basic Solidity](#basic-solidity) - [Deploying to a "Live" network](#deploying-to-a-live-network) - [Lesson 2: Storage Factory](#lesson-2-storage-factory) - [Inheritance, Factory Pattern, and Interacting with External Contracts](#inheritance-factory-pattern-and-interacting-with-external-contracts) - [Lesson 3: Fund Me](#lesson-3-fund-me) - [Payable, msg.sender, msg.value, Units of Measure](#payable-msgsender-msgvalue-units-of-measure) - [Chainlink Oracles](#chainlink-oracles) - [Importing from NPM and Advanced Solidity](#importing-from-npm-and-advanced-solidity) - [Lesson 4: Web3.py Simple Storage](#lesson-4-web3py-simple-storage) - [Installing VSCode, Python, and Web3](#installing-vscode-python-and-web3) - [Our First Python Script with Web3.py - Deploying a Contract](#our-first-python-script-with-web3py---deploying-a-contract) - [Interacting with Our Contract in Python & Web3.py](#interacting-with-our-contract-in-python--web3py) - [Lesson 5: Brownie Simple Storage](#lesson-5-brownie-simple-storage) - [Brownie Introduction](#brownie-introduction) - [Installing Brownie](#installing-brownie) - [Brownie Simple Storage Project](#brownie-simple-storage-project) - [Testing Basics](#testing-basics) - [[Brownie console]](#brownie-console) - [Lesson 6: Brownie Fund Me](#lesson-6-brownie-fund-me) - [Introduction](#introduction) - [Dependencies, Deploying, and Networks](#dependencies-deploying-and-networks) - [Funding and Withdrawing Python Scripts](#funding-and-withdrawing-python-scripts) - [Testing across networks](#testing-across-networks) - [Git](#git) - [Compatibility with Ganache UI](#compatibility-with-ganache-ui) - [Lesson 7: SmartContract Lottery](#lesson-7-smartcontract-lottery) - [Introduction](#introduction-1) - [`Lottery.sol`](#lotterysol) - [Testing Lottery.sol](#testing-lotterysol) - [Lottery.sol Testnet Deployment](#lotterysol-testnet-deployment) - [Lesson 8: Chainlink Mix](#lesson-8-chainlink-mix) - [Brownie Mixes](#brownie-mixes) - [Lesson 9: ERC20s, EIPs, and Token Standards](#lesson-9-erc20s-eips-and-token-standards) - [Lesson 10: Defi & Aave](#lesson-10-defi--aave) - [Defi Intro](#defi-intro) - [Aave UI](#aave-ui) - [Programmatic Interactions with Aave](#programmatic-interactions-with-aave) - [Testing](#testing) - [Lesson 11: NFTs](#lesson-11-nfts) - [Non-Technical Explainer](#non-technical-explainer) - [Simple NFT](#simple-nft) - [SimpleCollectible Testing](#simplecollectible-testing) - [Advanced NFT](#advanced-nft) - [Advanced deploy_and_create](#advanced-deploy_and_create) - [Creating Metadata & IPFS](#creating-metadata--ipfs) - [Lesson 12: Upgrades](#lesson-12-upgrades) - [Introduction to upgrading smart contracts](#introduction-to-upgrading-smart-contracts) - [Upgrades-mix and code](#upgrades-mix-and-code) - [Testing Upgrades](#testing-upgrades) - [Upgrades on a testnet](#upgrades-on-a-testnet) - [Bonus Lesson 13: Full Stack Defi](#bonus-lesson-13-full-stack-defi) - [Defi Stake Yield Brownie Scripts & Tests](#defi-stake-yield-brownie-scripts--tests) - [Testing our Defi Stake Yield Brownie Dapp](#testing-our-defi-stake-yield-brownie-dapp) - [Front End / Full Stack](#front-end--full-stack) - [Closing and Summary](#closing-and-summary) - [Security](#security) - [Where do I go now?](#where-do-i-go-now) - [Learning More](#learning-more) - [Community](#community) - [Hackathons](#hackathons) - [Vyper](#vyper) # Resources For This Course ### Questions - [Github Discussions](https://github.com/smartcontractkit/full-blockchain-solidity-course-py/discussions) - Ask questions and chat about the course here! - [Stack Exchange Ethereum](https://ethereum.stackexchange.com/) - Great place for asking technical questions about Ethereum - [StackOverflow](https://stackoverflow.com/) - Great place for asking technical questions overall ### Windows Support - [Setup your windows environment](https://medium.com/@cromewar/how-to-setup-windows-10-11-for-smart-contract-development-and-brownie-e7d8d13555b3) - Learn how to install all the tools you will need for this course on a windows machine ### Hiccups/Issues from the Video - [Chronological Issues from the Video](https://github.com/smartcontractkit/full-blockchain-solidity-course-py/blob/main/chronological-issues-from-video.md) - A list of known hiccups/issues you may encounter while implementing the content from the video # Lesson 0: Welcome To Blockchain ## What is a Blockchain? - [Bitcoin Whitepaper](https://bitcoin.org/bitcoin.pdf) - [Ethereum Whitepaper](https://ethereum.org/en/whitepaper/) - [Hybrid Smart Contracts](https://blog.chain.link/hybrid-smart-contracts-explained/) - [Blockchain Oracles](https://betterprogramming.pub/what-is-a-blockchain-oracle-f5ccab8dbd72?source=friends_link&sk=d921a38466df8a9176ed8dd767d8c77d) - [What is a blockchain](https://www.investopedia.com/terms/b/blockchain.asp) ## Making Your First Transaction - [Metamask](https://metamask.io/) - [Etherscan](https://etherscan.io/) - [Goerli Etherscan](https://goerli.etherscan.io/) - [Kovan Etherscan](https://kovan.etherscan.io/) - [Goerli Faucet](https://faucets.chain.link/goerli) - [Sepolia Faucet](https://sepoliafaucet.com/) - [Sepolia Etherscan](https://sepolia.etherscan.io/) - Rinkeby Faucet (Check the [link token contracts page](https://docs.chain.link/docs/link-token-contracts/#rinkeby)) - NOTE: You can always find the most up to date faucets at [faucets.chain.link](https://faucets.chain.link/). - OR, use the [Kovan ETH Faucet](https://faucets.chain.link/), just be sure to swap your metamask to kovan! - [Gas and Gas Fees](https://ethereum.org/en/developers/docs/gas/) - [Wei, Gwei, and Ether Converter](https://eth-converter.com/) - [ETH Gas Station](https://ethgasstation.info/) ## How Do Blockchains Work? - [Blockchain Demo](https://andersbrownworth.com/blockchain/) - [Public / Private Keys](https://andersbrownworth.com/blockchain/public-private-keys/keys) - [Layer 2 and Rollups](https://ethereum.org/en/developers/docs/scaling/layer-2-rollups/) - [Decentralized Blockchain Oracles](https://blog.chain.link/what-is-the-blockchain-oracle-problem/) - [Block Rewards](https://www.investopedia.com/terms/b/block-reward.asp) - [Run Your Own Ethereum Node](https://geth.ethereum.org/docs/getting-started) ### Consensus - [Consensus](https://wiki.polkadot.network/docs/learn-consensus) - [Proof of Stake](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos/) - [Proof of Work](https://ethereum.org/en/developers/docs/consensus-mechanisms/pow/) - [Nakamoto Consensus](https://blockonomi.com/nakamoto-consensus/) ## The Future - [Ethereum 2](https://ethereum.org/en/eth2/) ## Miscellaneous - [DAOs](https://www.investopedia.com/tech/what-dao/) # Lesson 1: [Welcome to Remix! Simple Storage](https://github.com/PatrickAlphaC/simple_storage) 💻 Code: https://github.com/PatrickAlphaC/simple_storage ### Everything in this section can be read about in the [Solidity Documentation](https://docs.soliditylang.org/en/v0.8.6/index.html) ### [Remix](https://remix.ethereum.org/) ### Basic Solidity - Versioning - Compiling - Contract Declaration - [Types & Declaring Variables](https://docs.soliditylang.org/en/v0.8.6/types.html) - `uint256`, `int256`, `bool`, `string`, `address`, `bytes32` - Default Initializations - Comments - Functions - Deploying a Contract - Calling a public state-changing Function - [Visibility](https://docs.soliditylang.org/en/v0.7.3/contracts.html#visibility-and-getters) - 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](https://faucets.chain.link/) - Connecting Metamask - Interacting with Deployed Contracts - The EVM # Lesson 2: [Storage Factory](https://github.com/PatrickAlphaC/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](https://github.com/PatrickAlphaC/fund_me) 💻 Code: https://github.com/PatrickAlphaC/fund_me ### Payable, msg.sender, msg.value, Units of Measure - Payable - [Wei/Gwei/Eth Converter](https://eth-converter.com/) - msg.sender & msg.value ### Chainlink Oracles - Decentralized Oracle Network Chainlink - Blockchains can't make API calls - Centralized Nodes are Points of Failure - [data.chain.link](https://data.chain.link/) - Getting External Data with Chainlink Oracles - [Chainlink](https://docs.chain.link/) - [Faucets and Contract Addresses](https://docs.chain.link/docs/link-token-contracts/) - [Kovan](https://docs.chain.link/docs/link-token-contracts/#kovan) - [Getting Price Information](https://docs.chain.link/docs/get-the-latest-price/) ### 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](https://docs.chain.link/docs/reference-contracts/) - getPrice - Tuples - Unused Tuple Variables - Matching Units (WEI/GWEI/ETH) - getConversionRate - Matching Units (Continued) - SafeMath & Integer Overflow - using keyword - [Libraries](https://docs.soliditylang.org/en/v0.8.6/contracts.html#libraries) - SafeMath PSA - Setting a Threshold - Require - Revert - Withdraw Function - Transfer - Balance - this - Contract Owners - Constructor - == - Modifiers - Resetting - for loop - Array Length - Forcing a Transaction - Recap # Lesson 4: [Web3.py Simple Storage](https://github.com/PatrickAlphaC/web3_py_simple_storage) 💻 Code: https://github.com/PatrickAlphaC/web3_py_simple_storage ### Installing VSCode, Python, and Web3 - [Developer Bootcamp Setup Instructions (metamask, vscode, python, nodejs..)](https://chain.link/bootcamp/brownie-setup-instructions) - [VSCode](https://code.visualstudio.com/download) - [VSCode Crash Course](https://www.youtube.com/watch?v=WPqXP_kLzpo) - Extensions - Short Cuts: - [VSCode Shortcuts](https://code.visualstudio.com/docs/getstarted/keybindings) - [VSCode MacOS Shortcuts](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf) - [Python](https://www.python.org/downloads/) - Install Troubleshooting - Terminal - Making a directory/Folder - Opening the folder up with VSCode - Creating a new file - Syntax Highlights - Remember to save! - Setting linting compile version - VSCode Solidity Settings - Formatting & Format on Save - Solidity Prettier - [Python Black](https://pypi.org/project/black/) - [pip](https://pypi.org/project/pip/) ### Our First Python Script with Web3.py - Deploying a Contract - Reading our solidity file - Running a Python Script in the Terminal - [MaxOS Shortcuts](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-macos.pdf) - [Windows Shortcuts](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-windows.pdf) - [Linux Shortcuts](https://code.visualstudio.com/shortcuts/keyboard-shortcuts-linux.pdf) - Compiling in Python - [py-solc-x](https://pypi.org/project/py-solc-x/) - compile_standard - Colorized Brackets - JSON ABI - Saving Compiled Code - Formatting JSON - Deploying in Python 1. Get Bytecode 2. Get ABI 3. Choose Blockchain to Deploy To - Local Ganache Chain - [Ganache UI](https://www.trufflesuite.com/ganache) - [Ganache Command Line](https://github.com/trufflesuite/ganache-cli) - [Web3.py](https://web3py.readthedocs.io/en/stable/) - HTTP / RPC Provider - Private Keys MUST start with "0x" - Contract Object - Building a Transaction - Account Nonce - Calling "Constructor" - Transaction Parameters - Signing the Transaction - NEVER put your private key directly in your code - [Setting Environment Variables (Windows, Linux, MacOS)](https://www.twilio.com/blog/2017/01/how-to-set-environment-variables.html) - [More on Windows Environment Variables](https://www.youtube.com/watch?v=tqWDiu8a4gc&t=40s) - Exported Environment Variables Only Last the Duration of the Shell/Terminal - Private Key PSA - .env file - .gitignore - Loading .env File in Python - [python-dotenv](https://pypi.org/project/python-dotenv/) - Viewing our Transaction / Deployment in Ganache - Waiting for Block Confirmations ### 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](https://github.com/trufflesuite/ganache-cli) - Installing Ganache - [Install Nodejs](https://nodejs.org/en/) - [Install Yarn](https://classic.yarnpkg.com/en/docs/install) - Working with ganache-cli - Open a new terminal in the same window - Deploying to a testnet - [Infura](https://infura.io/) - [Alchemy](https://www.alchemy.com/) - Using Infura RPC URL / HTTP Provider - [Chain Ids](https://chainlist.org/) - Wow this seems like a lot of work... Is there a better way? # Lesson 5: [Brownie Simple Storage](https://github.com/PatrickAlphaC/brownie_simple_storage) 💻 Code: https://github.com/PatrickAlphaC/brownie_simple_storage ### Brownie Introduction - Some Users: - https://yearn.finance/ - https://curve.fi/ - https://badger.finance/ ### Installing Brownie - [Installing Brownie](https://eth-brownie.readthedocs.io/en/stable/install.html) - Install pipx - pipx install eth-brownie - Testing Successful Install ### 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 ` 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`](https://docs.pytest.org/en/6.2.x/assert.html) - `brownie test` - `test_updating_storage` - [Pytest / Brownie Test Tips](https://docs.pytest.org/en/6.2.x/) - 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](https://github.com/PatrickAlphaC/brownie_fund_me) 💻 Code: https://github.com/PatrickAlphaC/brownie_fund_me ### Introduction - Setup ### Dependencies, Deploying, and Networks - Dependencies - [chainlink-brownie-contracts](https://github.com/smartcontractkit/chainlink-brownie-contracts) - remappings - Deploy Script (V1) - `helpful_scripts.py` - `__init__.py` - Deploy to Rinkeby - Contract Verification (`publish_source`) - The Manual Way - "Flattening" - The Programmatic Way - Getting an [Etherscan API Key](https://etherscan.io/apis) - `ETHERSCAN_TOKEN` - Interacting with Etherscan - Deploying to Local Chains - Introduction to Mocking - Constructor Parameters - `networks` in our `brownie-config.yaml` - Copying [Mock Contracts from chainlink-mix](https://github.com/smartcontractkit/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](https://www.alchemy.com/) - `brownie test --network mainnet-fork` - brownie ganache vs local ganache vs mainnet-fork vs testnet... ### Git - [Installing Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - Creating a repository - [First time with git](https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup) - [Adding our project to github](https://docs.github.com/en/github/importing-your-projects-to-github/importing-source-code-to-github/adding-an-existing-project-to-github-using-the-command-line) - Tweet it out! ### Compatibility with Ganache UI - `test_only_owner_can_withdraw()` gives below error if the selected network is Ganache UI:: ``` E ValueError: Execution reverted during call: 'VM Exception while processing transaction: revert'. This transaction will likely revert. If you wish to broadcast, include `allow_revert:True` as a transaction parameter. ``` [More information here.](https://ethereum.stackexchange.com/questions/114889/deploying-ganache-local-w-brownie-vm-exception-while-processing-transaction-in) # Lesson 7: [SmartContract Lottery](https://github.com/PatrickAlphaC/smartcontract-lottery) 💻 Code: https://github.com/PatrickAlphaC/smartcontract-lottery [Chainlink VRF v1 docs](https://docs.chain.link/vrf/v1/examples/get-a-random-number) ### Introduction - Add a `README.md` - Defining the project - Is it decentralized? ### `Lottery.sol` - basic setup - Main Functions - address payable[] - getEntranceFee & Setup - [Chainlink Price Feed](https://docs.chain.link/docs/get-the-latest-price/) - brownie-config - SPDX - Matching Units of Measure - Can't just divide - Test early and often - Quick Math Sanity Check - deleting networks - [Alchemy](https://www.alchemy.com/) again - Enum - `startLottery` - [Openzeppelin](https://openzeppelin.com/contracts/)... Is this the first openzeppelin reference? - [Openzeppelin Contracts Github](https://github.com/OpenZeppelin/openzeppelin-contracts) - Randomness - Pseudorandomness - `block` keyword - `block.difficulty` - `block.timestamp` - `keccack256` - [True Randomness with Chainlink VRF](https://docs.chain.link/docs/get-a-random-number/) - [VRFConsumerBase.sol](https://github.com/smartcontractkit/chainlink/blob/develop/contracts/src/v0.8/vrf/VRFConsumerBase.sol) - Chainlink VRF Remix Version - Inheriting Constructors - Oracle Gas & Transaction Gas - [Why didn't we pay gas on the price feeds?](https://ethereum.stackexchange.com/questions/87473/is-chainlinks-price-reference-data-free-to-consume) - Chainlink Node Fees - [Request And Receive Introduction](https://docs.chain.link/docs/architecture-request-model/) - [Kovan Faucets](https://docs.chain.link/docs/link-token-contracts/#kovan) - Funding Chainlink Contracts - [Request And Receive Explanation](https://docs.chain.link/docs/architecture-request-model/) - A Clarification - `endLottery` - `returns (type variableName)` - `fulfillRandomness` - `override` - Modulo Operation (Mod Operation %) - Paying the lottery winner - Resetting the lottery ### 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 - `topics` - [conftest.py](https://stackoverflow.com/questions/34466027/in-pytest-what-is-the-use-of-conftest-py-files) # Lesson 8: [Chainlink Mix](https://github.com/smartcontractkit/chainlink-mix) 💻 Code: https://github.com/smartcontractkit/chainlink-mix ## [Brownie Mixes](https://github.com/brownie-mix) # Lesson 9: [ERC20s, EIPs, and Token Standards](https://github.com/PatrickAlphaC/erc20-brownie-py) 💻 Code: https://github.com/PatrickAlphaC/erc20-brownie-py - [ERC20/EIP20 Standard](https://eips.ethereum.org/EIPS/eip-20) - What is an ERC20? - Creating an ERC20 - [OpenZeppelin ERC20](https://docs.openzeppelin.com/contracts/2.x/api/token/erc20) - [Solidity 0.8](https://docs.soliditylang.org/en/breaking/080-breaking-changes.html) - I Challenge you to code this yourself! - `deploy_token.py` - Copy paste `helpful_scripts.py` - Viewing our token in metamask - Adding to an exchange # Lesson 10: [Defi & Aave](https://github.com/PatrickAlphaC/aave_brownie_py_freecode) \*NOTE: This repo is now archived as kovan is no longer supported. You can still follow along with the learning, but know the code may not work the same on a different testnet. 💻 Code: https://github.com/PatrickAlphaC/aave_brownie_py_freecode ### Defi Intro - [Defipulse](https://defipulse.com/) - [Defillama](https://defillama.com/) - [Aave Testnet Site](https://staging.aave.com/) - [Paraswap](https://paraswap.io/) - Decentralized Exchange ### Aave UI - [Kovan ETH](https://docs.chain.link/docs/link-token-contracts/#kovan) - What is Aave? - Borrowing and Lending - Connecting to Aave - Depositing Tokens / Lending - Checking your transaction is correct - WETH Gateway - Interest Bearing Token (aToken) - Collateral - [DAI](https://makerdao.com/en/) - [Stablecoin](https://www.investopedia.com/terms/s/stablecoin.asp) - [Wrapped Bitcoin (wBTC)](https://www.gemini.com/cryptopedia/wrapped-bitcoin-what-can-you-do) - [Why borrow tokens?](https://docs.aave.com/faq/borrowing) - [Blockchain Fintech Tutorial](https://blog.chain.link/blockchain-fintech-defi-tutorial-lending-borrowing-python/) - DISCLAIMER ABOUT BORROWING - Borrowing Tokens - [Liquidations](https://docs.aave.com/faq/liquidations) - Your health factor must be above 1 - [Solvent](https://www.investopedia.com/terms/s/solvency.asp) - [Stable vs Variable Interest Rate](https://docs.aave.com/faq/borrowing#what-is-the-difference-between-stable-and-variable-rate) - Repaying our borrows/loans - Reward token / governance token - Governance ### [Programmatic Interactions with Aave](https://github.com/PatrickAlphaC/aave_brownie_py_freecode) - Quant Defi Engineer - [Aave Documentation](https://docs.aave.com/developers/) - Setup - Converting ETH -> WETH - `get_weth.py` - [IWETH](https://github.com/PatrickAlphaC/aave_brownie_py/blob/main/interfaces/WethInterface.sol) - [Kovan WETH Token Address: 0xd0a1e359811322d97991e03f863a0c30c2cf029c](https://kovan.etherscan.io/token/0xd0a1e359811322d97991e03f863a0c30c2cf029c) - [Mainnet WETH Token Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https://etherscan.io/token/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2) - Converting WETH -> ETH with `withdraw` - `aave_borrow.py` - [LendingPool](https://docs.aave.com/developers/the-core-protocol/lendingpool) - [LendingPoolAddressProvider](https://docs.aave.com/developers/the-core-protocol/addresses-provider) - [LendingPool and LendingPoolAddressProvider Addresses](https://docs.aave.com/developers/deployed-contracts/deployed-contracts) - Fixing import dependencies - [Aave Github](https://github.com/aave/protocol-v2) - [ERC20 Approve Function](https://medium.com/ethex-market/erc20-approve-allow-explained-88d6de921ce9) - [IERC20 from Patrick's repo](https://github.com/PatrickAlphaC/aave_brownie_py/blob/main/interfaces/IERC20.sol) - `deposit` - [getUserAccountData](https://docs.aave.com/developers/the-core-protocol/lendingpool#getuseraccountdata) - Liquidation Threshold - [Risk Parameters](https://docs.aave.com/risk/asset-risk/risk-parameters) - Borrowing DAI - Getting DAI Conversion Rate - [Chainlink Price Feeds](https://docs.chain.link/docs/reference-contracts/) - [AggregatorV3Interface](https://github.com/PatrickAlphaC/aave_brownie_py/blob/main/interfaces/AggregatorV3Interface.sol) - [borrow](https://docs.aave.com/developers/the-core-protocol/lendingpool#borrow) - [Mainnet DAI Address: 0x6b175474e89094c44da98b954eedeac495271d0f](https://etherscan.io/token/0x6b175474e89094c44da98b954eedeac495271d0f) - [Aave Testnet Token Addresses](https://aave.github.io/aave-addresses/kovan.json) - Repaying - Kovan Run - Viewing the transactions ### Testing # Lesson 11: [NFTs](https://github.com/PatrickAlphaC/nft-demo) 💻 Code: https://github.com/PatrickAlphaC/nft-demo ### Non-Technical Explainer - [End-to-end article](https://www.freecodecamp.org/news/how-to-make-an-nft-and-render-on-opensea-marketplace/) - What is an NFT? - [ERC721](https://eips.ethereum.org/EIPS/eip-721) - Token URI - [Token Metadata Example](https://docs.opensea.io/docs/2-adding-metadata) - [IPFS](https://ipfs.io/) ### Simple NFT - [brownie mix](https://github.com/PatrickAlphaC/nft-mix) - Initial Setup - `SimpleCollectible.sol` - [OpenZeppelin ERC721](https://docs.openzeppelin.com/contracts/3.x/) - [Pug Image](https://github.com/PatrickAlphaC/nft-mix/blob/main/img/pug.png) - NFT Constructor - NFT is a type of factory pattern - `createCollectible` - `_safeMint` - TokenURI & Metadata - Opensea listing example - Is this decentralized? - Ethereum Size and dStorage - [Ethereum Size](https://ycharts.com/indicators/ethereum_chain_full_sync_data_size) - [dStorage Solutions](https://ethereum.org/en/developers/docs/storage/) - [IPFS](https://www.ipfs.com/) - You need to have your NFT attributes both on-chain and inside your tokenURI metadata - `deploy_and_create.py` - [TokenURI used for the demo: https://ipfs.io/ipfs/Qmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=0-PUG.json](https://ipfs.io/ipfs/Qmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=0-PUG.json) - [IPFS Companion](https://chrome.google.com/webstore/detail/ipfs-companion/nibjojkomfdiaoajekhjakgkdhaomnch?hl=en) - Rinkeby Deployment - [Opensea Example](https://testnets.opensea.io/assets/0x8acb7ca932892eb83e4411b59309d44dddbc4cdf/0) ### SimpleCollectible Testing - What else with NFTs? ### Advanced NFT - `AdvancedCollectible.sol` - [Dungeons and Dragons Example](https://github.com/PatrickAlphaC/dungeons-and-dragons-nft) - Double Inherited Constructors - `createCollectible` (Advanced) - `tokenIdToBreed` - Working with in-flight Chainlink VRF requests - Download the NFT images from the [nft-mix](https://github.com/PatrickAlphaC/nft-mix) - `setTokenURI` - `_isApprovedOrOwner` - Emit events when you update mappings - [`indexed` event keyword](https://ethereum.stackexchange.com/questions/8658/what-does-the-indexed-keyword-do/8659) ### Advanced deploy_and_create - Move `OPENSEA_URL` to `helpful_scripts` - Deploying AdvancedCollectible - Opensea testnet is only compatible with Rinkeby - [Rinkeby Chainlink VRF Contract Addresses](https://docs.chain.link/docs/vrf-contracts/#rinkeby) - Speeding through adding functions from previous projects - Deploy to Rinkeby - `create_collectible.py` - A quick unit test - A quick integration test ### Creating Metadata & IPFS - `create_metadata.py` - `get_breed` - Metadata Folder - `metadata_template` - NFT Metadata Attributes - Checking if Metadata file already exists - Uploading to IPFS - `upload_to_ipfs` - [Download IPFS Command Line](https://docs.ipfs.io/install/command-line/) - [Download IPFS Desktop](https://docs.ipfs.io/install/ipfs-desktop/) - [HTTP IPFS Docs](https://docs.ipfs.io/reference/http/api/) - `ipfs daemon` - [Pinata](https://app.pinata.cloud/) - [Pinata Docs](https://docs.pinata.cloud/) - Refactoring to not re-upload to IPFS - Setting the TokenURI - End-To-End Manual Testnet Test - Viewing on Opensea # Lesson 12: [Upgrades](https://github.com/PatrickAlphaC/upgrades-mix) 💻 Code: https://github.com/PatrickAlphaC/upgrades-mix ### Introduction to upgrading smart contracts - [Original Video](https://www.youtube.com/watch?v=bdXJmWajZRY) - Smart Contracts can be upgraded! - Does this mean they are not immutable? - [Trail of Bits on Upgradeable Smart Contracts](https://blog.trailofbits.com/2018/09/05/contract-upgrade-anti-patterns/) - The "Not Really Upgrading" / Parameterization Method - The Social Yeet / Migration Method - [Contract Migration](https://blog.trailofbits.com/2018/10/29/how-contract-migration-works/) - Proxies - DelegateCall - Terminology: - Implementation Contract - Proxy Contract - User - Admin - Gotchas: - Storage Clashes - Function Selector - Function Selector Clashes - Proxy Patterns: - [Transparent Proxy Pattern](https://blog.openzeppelin.com/the-transparent-proxy-pattern/) - [Universal Upgrade Proxy Standard](https://eips.ethereum.org/EIPS/eip-1822) - [Diamond/Multi-Facet Proxy](https://eips.ethereum.org/EIPS/eip-2535) ### Upgrades-mix and code - Setup - `Box.sol` - `BoxV2.sol` - Getting the proxy contracts - [Openzeppelin Proxy Github](https://github.com/OpenZeppelin/openzeppelin-contracts/tree/master/contracts/proxy/transparent) - `01_deploy_box.py` - Hooking up a proxy to our implementation contract - (Optional) [Creating a Gnosis Safe](https://help.gnosis-safe.io/en/articles/3876461-create-a-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](https://github.com/PatrickAlphaC/defi-stake-yield-brownie-freecode) _Note: This section is archived as kovan is now deprecated. If you're looking to learn more Full-stack, check out the full stack portions of the hardhat/javascript video._ _Link to hardhat/javascript video with more full-stack examples: https://github.com/smartcontractkit/full-blockchain-solidity-course-js_ 💻 Code: https://github.com/PatrickAlphaC/defi-stake-yield-brownie-freecode - [FreeCodeCamp React](https://www.freecodecamp.org/news/tag/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](https://erc20faucet.com/) - If the link above does not work, you can get another ERC20 token using this faucet: [Weenus ERC20 Faucet](https://github.com/bokkypoobah/WeenusTokenFaucet) - 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](https://reactjs.org/) - [useDapp](https://usedapp.readthedocs.io/en/latest/) - [npx](https://www.npmjs.com/package/npx) - [yarn](https://classic.yarnpkg.com/en/docs/install/) - `create-react-app` - Layout - [Testing Front End](https://www.freecodecamp.org/news/testing-react-hooks/) - yarn && yarn start - Connecting our wallets - Install useDapp - Header Component - Connect Button - [Material-UI](https://material-ui.com/) - Making our button nicer - `Main.tsx` - Sending `brownie-config` & `build` folder to our UI - Helper Config - TypeScript error suppression - Getting addresses - [Ethers](https://docs.ethers.io/v5/) - Only support kovan - `YourWallet` - `supportedTokens` - State Hooks - Showing tokens - `WalletBalance` - [`ethersproject/units`](https://www.npmjs.com/package/@ethersproject/units) - `BalanceMsg` - Stake Form - Calling `approve` - `useContractFunction` - `useEffect` - Notifications - Make it pretty - Alerts Shoutout to [Matt](https://twitter.com/mdurkin92) for the help on the front end! # Closing and Summary ## Security - [Best Practices](https://consensys.github.io/smart-contract-best-practices/) - [Attacks](https://consensys.github.io/smart-contract-best-practices/attacks/) - [Oracle Attacks](https://hackernoon.com/how-dollar100m-got-stolen-from-defi-in-2021-price-oracle-manipulation-and-flash-loan-attacks-explained-3n6q33r1) - [Re-entrancy Attacks](https://quantstamp.com/blog/what-is-a-re-entrancy-attack) - [Damn Vulnerable Defi](https://www.damnvulnerabledefi.xyz/) - [Ethernaut](https://ethernaut.openzeppelin.com/) - Some Auditors - [OpenZeppelin](https://openzeppelin.com/) - [SigmaPrime](https://sigmaprime.io/) - [Trail of Bits](https://www.trailofbits.com/) ## Where do I go now? ### Learning More - [CryptoZombies](https://cryptozombies.io/) - [Dapp University](https://www.youtube.com/channel/UCY0xL8V6NzzFcwzHCgB8orQ) - [ChainShot](https://www.chainshot.com/courses) - [Ivan on Tech](https://academy.ivanontech.com/) - [Eat the Blocks](https://www.youtube.com/channel/UCZM8XQjNOyG2ElPpEUtNasA) - [Patrick Collins](https://www.youtube.com/channel/UCn-3f8tw_E1jZvhuHatROwA) - [Austin Griffith](https://www.youtube.com/channel/UC_HI2i2peo1A-STdG22GFsA) - [Nader Dabit](https://www.youtube.com/user/boyindasouth) - [Ethereum.org](https://ethereum.org/en/) ### Community - Twitter - [Brownie Discord](https://discord.gg/9zk7snTfWe) - [Ethereum Discord](https://ethereum.org/en/) - [Chainlink Discord](https://discord.gg/2YHSAey) - [Reddit ethdev](https://www.reddit.com/r/ethdev/) ### Hackathons - [CL Hackathon](https://chain.link/hackathon) - [ETH Global](https://ethglobal.co/) - [ETH India](https://twitter.com/ETHIndiaco) Be sure to check out project grant programs! ### Vyper [From solidity course to vyper](https://github.com/chalex-eth/From-solidity-course-to-vyper-py) And make today an amazing day!