Repository: smartcontractkit/full-blockchain-solidity-course-py
Branch: main
Commit: 626a33ad7e3e
Files: 4
Total size: 44.7 KB
Directory structure:
gitextract_3ym1xur5/
├── .gitignore
├── LICENSE
├── README.md
└── chronological-issues-from-video.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
.vscode
.env
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2021 SmartContract
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
_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)
<br/>
<p align="center">
<a href="https://www.youtube.com/watch?v=M576WGiDBdQ" target="_blank">
<img src="./img/youtube_thumbnail.jpeg" width="350" alt="Solidity, Blockchain, and Smart Contract Course – Beginner to Expert Python Tutorial">
</a>
</p>
<br/>
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 <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`](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!
================================================
FILE: chronological-issues-from-video.md
================================================
# About
This file will list issues/updates by timestamp. If you have an issue that you don't see here, please make an issue on this repo.
## Faucet Issues
- If you have any issues with a faucet, please try another testnet. You'll have to update some contract addresses based on the testnet you're working on. You can find the [most up to date faucets here.](https://docs.chain.link/docs/link-token-contracts/)
- If the Rinkeby faucet isn't working, you can use a kovan faucet, just be sure to use Kovan Etherscan and Kovan in your Metamask!
- *Big Update*: [New Rinkeby Faucet Located Here](https://faucets.chain.link/rinkeby)
- You can find [Backup Faucets here](https://docs.chain.link/docs/link-token-contracts/#rinkeby)
## Linting issues
If you see something along the lines of:
```
ParserError: Source "OpenZeppelin/openzeppelin-contracts@3.4.0/contracts/access/Ownable.sol" not found: File not found.
import "@openzeppelin/contracts/access/Ownable.sol";
```
In your vscode, these and be safely ignored. However you can also add to your settings to ignore these.
1. Create a `.vscode` folder at the root of your project.
2. Create a file called `settings.json`
3. Add the following code:
```json
{
"solidity.remappings": [
"@chainlink/=/Users/patrick/.brownie/packages/smartcontractkit/chainlink-brownie-contracts@0.2.2",
"@openzeppelin/=/Users/patrick/.brownie/packages/OpenZeppelin/openzeppelin-contracts@4.3.2"
]
}
```
Or whatever version your `@chainlink` and `@openzeppelin` contracts need. For example:
<img width="1190" alt="Screen Shot 2021-10-05 at 6 01 45 PM" src="https://user-images.githubusercontent.com/54278053/136108868-15739283-0789-4ce1-bf4a-7491ea4b7c2e.png">
**Note:** remember this is an example, you must provide the actual location on which your `.brownie` folder is located. For more info on on this please refer [here](https://n4n0b1t3.medium.com/how-to-make-vsc-solidity-lint-recognize-your-chainlink-and-openzeppelin-libraries-73775129261c).
## Integration Testing Issues
- In some integration tests, we do something like `time.sleep(60)`. Sometimes, you'll have to do much longer, we've had reports go up to `time.sleep(300)`. So, if you want to try that, go get a coffee break while your integration test runs!
## Python related issues
- In some environments Web3.py may not work due to the **Cytools** error, which means your computer lacks some `C` language libraries in order to execute.
[Here](https://medium.com/@cromewar/the-mighty-cytools-error-at-web3-smart-contract-development-with-brownie-63335d50f230) you can find a detailed guide about how to solve the problem.
## Lesson 3:
- [2:37:05](https://youtu.be/M576WGiDBdQ?t=9425) Kovan vs Rinkeby
- Our `FundMe.sol` needs to be deployed to the *rinkeby* chain to work, but if you go to try the price feeds from the Chainlink docs using the remix link, that one has the *kovan* price feeds in it, so needs to be deployed to kovan.
- If you want to test the price feeds from the video using the Chainlink docs remix link, you'll need to follow the steps to [get kovan ETH](https://docs.chain.link/docs/link-token-contracts/#kovan).
## Lesson 4:
- [3:43:52](https://youtu.be/M576WGiDBdQ?t=13432) Installing solcx version 0.6.0
- In the video, we forgot to do 2 things in order to compile our solidity code:
- Import `install_solc`, so we need to change this line:
- `from solcx import compile_standard`
- To this line:
- `from solcx import compile_standard, install_solc`
- And then, we need to add a line right before we run the `compile_standard` code:
- `install_solc("0.6.0")`
- [4:00:00](https://www.youtube.com/watch?v=M576WGiDBdQ&t=14423s) Issue with ganache and web3.py
- As of `5.25.0` of [web3.py](https://github.com/ethereum/web3.py/tags), we now need to add gasPrice to our transactions with a local ganache chain.
- Adding `"gasPrice": w3.eth.gas_price,` should fix your issue in the transactions.
Full Example:
```python
transaction = SimpleStorage.constructor().buildTransaction(
{
"chainId": chain_id,
"gasPrice": w3.eth.gas_price,
"from": my_address,
"nonce": nonce,
}
)
```
- [3:56:20](https://youtu.be/M576WGiDBdQ?t=13372) Colorized Brackets.
* The referenced extension has been deprecated due to VS code adding native functionality. To enable the new setting search for `bracket` and check the checkbox below:
`Editor > Bracket Pair Colorization:` **Enabled**

- [3:55:09](https://youtu.be/M576WGiDBdQ?t=14109) Confusing network ID and chain ID
- In the video the network ID is copied instead of the chain id.
Whenever the terms Network ID and Chain ID are used without distinction, it should be noted that both IDs can be different for a server such as Ganache. As you can see here, Ganache can be using different IDs.
```
>>> from web3 import Web3
>>> w3 = Web3(Web3.HTTPProvider("http://127.0.0.1:8545"))
>>> w3.eth.chain_id
1337
>>> w3.net.version
'5777'
>>>
```
## Lesson 6
- [5:44:00](https://youtu.be/M576WGiDBdQ?t=20640)
- In the video, the getEntranceFee() function returns `(minimumUSD * precision) / price`
- Integer divisions are rounded towards 0 in Solidity, so this function will almost always return an amount worth slightly less than our minimum price. It makes it unusable with the fund() function because the transaction will revert everytime.
- To fix it we can round up the result
- getEntranceFee() function should return `((minimumUSD * precision) / price) + 1`
- This fix has been [merged](https://github.com/PatrickAlphaC/brownie_fund_me/pull/32/files) and you can read more explanation about the issue [here](https://github.com/PatrickAlphaC/brownie_fund_me/issues/10#issuecomment-1041602057)
## Lesson 7
**In the video, we use Chainlink VRF v1 and the documentation has been updated to V2. You can view the [V1 documentation here](https://docs.chain.link/docs/get-a-random-number/v1/)**
- Looking for the VRF Coordinator contract by yourself will probably bring you to the v2 address of it. Make sure to use the v1 VRF Coordinator contract in the brownie-config.yaml file, because it won't work with the v2 contract. The repository has already the correct contract address.
- [8:06:54ish](https://youtu.be/M576WGiDBdQ?t=29214)
- In the video, we use events exclusivly to test our contracts, however, we could have also used `tx.return_value` to get the return value of a function.
- However, it's still best practice to learn how to use events, especially when updating mappings!
- [8:10:20ish](https://youtu.be/M576WGiDBdQ?t=29423)
- In the video, `starting_balance_of_account` and `balance_of_lottery` are retrieved AFTER `lottery.endLottery()`
- For correctness those 2 statements should be run BEFORE `lottery.endLottery()`
- The tests pass because `starting_balance_of_account == account.balance()` (L81) and `lottery.balance()` is already 0
- This is a subtle bug in the test, which also showcases a problem with tests - we have no one to test the tests ;) Still, having tests is better than not having them, just don't put all your assurances into them
## Lesson 10
- The Aave testnet site has moved from `https://testnet.aave.com` to `https://staging.aave.com` and some of the functionality is lost :(
- For our `repay_all` function, we originally had:
```python
repay_all(AMOUNT, lending_pool, account)
```
But it should be:
```
repay_all(Web3.toWei(amount_dai_to_borrow, "ether"), lending_pool, account)
```
We want to pay back the DAI not the ETH! Just remember, you'll still have a vveerrrryyyy small amount of DAI borrowed because of interest. If you see something with an `E` in it, you did it right!
gitextract_3ym1xur5/ ├── .gitignore ├── LICENSE ├── README.md └── chronological-issues-from-video.md
Condensed preview — 4 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (47K chars).
[
{
"path": ".gitignore",
"chars": 13,
"preview": ".vscode\n.env\n"
},
{
"path": "LICENSE",
"chars": 1070,
"preview": "MIT License\n\nCopyright (c) 2021 SmartContract\n\nPermission is hereby granted, free of charge, to any person obtaining a c"
},
{
"path": "README.md",
"chars": 36837,
"preview": "_Big Update_: [New Sepolia Faucet Located Here](https://sepoliafaucet.com/).\n\\Kovan, Ropsten, and Rinkeby have been depr"
},
{
"path": "chronological-issues-from-video.md",
"chars": 7831,
"preview": "# About\n\nThis file will list issues/updates by timestamp. If you have an issue that you don't see here, please make an i"
}
]
About this extraction
This page contains the full source code of the smartcontractkit/full-blockchain-solidity-course-py GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 4 files (44.7 KB), approximately 12.7k tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.