[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-10475":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":10,"languages":10,"totalLinesOfCode":10,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":15,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":15,"starSnapshotCount":15,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},10475,"full-blockchain-solidity-course-py","smartcontractkit\u002Ffull-blockchain-solidity-course-py","smartcontractkit","Ultimate Solidity, Blockchain, and Smart Contract - Beginner to Expert Full Course | Python Edition","",null,11204,2939,250,224,0,9,45,"MIT License",false,"main",true,[23,24,25,26,27,28,29],"blockchain","chainlink","dapp","ethereum","smart-contracts","solidity","web3","2026-06-12 02:02:22","_Big Update_: [New Sepolia Faucet Located Here](https:\u002F\u002Fsepoliafaucet.com\u002F).\n\\Kovan, Ropsten, and Rinkeby have been deprecated. Goerli Still works but we highly recommend Sepolia as its proof of stake based.\n\nYou'll need to verify via Twitter to get ETH & LINK.\nYou can find [Backup Faucets here](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Flink-token-contracts\u002F#goerli).\n\nAdditionally, lesson 7 uses Chainlink VRF v1 instead of v2, [you can find the docs for Chainlink VRFv1 here](https:\u002F\u002Fdocs.chain.link\u002Fvrf\u002Fv1\u002Fexamples\u002Fget-a-random-number).\n\n[YouTube Video](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=M576WGiDBdQ)\n\n\u003Cbr\u002F>\n\u003Cp align=\"center\">\n\u003Ca href=\"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=M576WGiDBdQ\" target=\"_blank\">\n\u003Cimg src=\".\u002Fimg\u002Fyoutube_thumbnail.jpeg\" width=\"350\" alt=\"Solidity, Blockchain, and Smart Contract Course – Beginner to Expert Python Tutorial\">\n\u003C\u002Fa>\n\u003C\u002Fp>\n\u003Cbr\u002F>\n\nWelcome to the repository for the Ultimate Solidity, Blockchain, and Smart Contract - Beginner to Expert Full Course | Python Edition FreeCodeCamp course!\n\n# Table of Contents\n\n- [Table of Contents](#table-of-contents)\n- [Resources For This Course](#resources-for-this-course)\n  - [Questions](#questions)\n  - [Windows Support](#windows-support)\n  - [Hiccups\u002FIssues from the Video](#hiccupsissues-from-the-video)\n- [Lesson 0: Welcome To Blockchain](#lesson-0-welcome-to-blockchain)\n  - [What is a Blockchain?](#what-is-a-blockchain)\n  - [Making Your First Transaction](#making-your-first-transaction)\n  - [How Do Blockchains Work?](#how-do-blockchains-work)\n    - [Consensus](#consensus)\n  - [The Future](#the-future)\n  - [Miscellaneous](#miscellaneous)\n- [Lesson 1: Welcome to Remix! Simple Storage](#lesson-1-welcome-to-remix-simple-storage)\n  - [Everything in this section can be read about in the Solidity Documentation](#everything-in-this-section-can-be-read-about-in-the-solidity-documentation)\n  - [Remix](#remix)\n  - [Basic Solidity](#basic-solidity)\n  - [Deploying to a \"Live\" network](#deploying-to-a-live-network)\n- [Lesson 2: Storage Factory](#lesson-2-storage-factory)\n  - [Inheritance, Factory Pattern, and Interacting with External Contracts](#inheritance-factory-pattern-and-interacting-with-external-contracts)\n- [Lesson 3: Fund Me](#lesson-3-fund-me)\n  - [Payable, msg.sender, msg.value, Units of Measure](#payable-msgsender-msgvalue-units-of-measure)\n  - [Chainlink Oracles](#chainlink-oracles)\n  - [Importing from NPM and Advanced Solidity](#importing-from-npm-and-advanced-solidity)\n- [Lesson 4: Web3.py Simple Storage](#lesson-4-web3py-simple-storage)\n  - [Installing VSCode, Python, and Web3](#installing-vscode-python-and-web3)\n  - [Our First Python Script with Web3.py - Deploying a Contract](#our-first-python-script-with-web3py---deploying-a-contract)\n  - [Interacting with Our Contract in Python & Web3.py](#interacting-with-our-contract-in-python--web3py)\n- [Lesson 5: Brownie Simple Storage](#lesson-5-brownie-simple-storage)\n  - [Brownie Introduction](#brownie-introduction)\n  - [Installing Brownie](#installing-brownie)\n  - [Brownie Simple Storage Project](#brownie-simple-storage-project)\n  - [Testing Basics](#testing-basics)\n  - [[Brownie console]](#brownie-console)\n- [Lesson 6: Brownie Fund Me](#lesson-6-brownie-fund-me)\n  - [Introduction](#introduction)\n  - [Dependencies, Deploying, and Networks](#dependencies-deploying-and-networks)\n  - [Funding and Withdrawing Python Scripts](#funding-and-withdrawing-python-scripts)\n  - [Testing across networks](#testing-across-networks)\n  - [Git](#git)\n  - [Compatibility with Ganache UI](#compatibility-with-ganache-ui)\n- [Lesson 7: SmartContract Lottery](#lesson-7-smartcontract-lottery)\n  - [Introduction](#introduction-1)\n  - [`Lottery.sol`](#lotterysol)\n  - [Testing Lottery.sol](#testing-lotterysol)\n  - [Lottery.sol Testnet Deployment](#lotterysol-testnet-deployment)\n- [Lesson 8: Chainlink Mix](#lesson-8-chainlink-mix)\n  - [Brownie Mixes](#brownie-mixes)\n- [Lesson 9: ERC20s, EIPs, and Token Standards](#lesson-9-erc20s-eips-and-token-standards)\n- [Lesson 10: Defi & Aave](#lesson-10-defi--aave)\n  - [Defi Intro](#defi-intro)\n  - [Aave UI](#aave-ui)\n  - [Programmatic Interactions with Aave](#programmatic-interactions-with-aave)\n  - [Testing](#testing)\n- [Lesson 11: NFTs](#lesson-11-nfts)\n  - [Non-Technical Explainer](#non-technical-explainer)\n  - [Simple NFT](#simple-nft)\n  - [SimpleCollectible Testing](#simplecollectible-testing)\n  - [Advanced NFT](#advanced-nft)\n  - [Advanced deploy_and_create](#advanced-deploy_and_create)\n  - [Creating Metadata & IPFS](#creating-metadata--ipfs)\n- [Lesson 12: Upgrades](#lesson-12-upgrades)\n  - [Introduction to upgrading smart contracts](#introduction-to-upgrading-smart-contracts)\n  - [Upgrades-mix and code](#upgrades-mix-and-code)\n  - [Testing Upgrades](#testing-upgrades)\n  - [Upgrades on a testnet](#upgrades-on-a-testnet)\n- [Bonus Lesson 13: Full Stack Defi](#bonus-lesson-13-full-stack-defi)\n  - [Defi Stake Yield Brownie Scripts & Tests](#defi-stake-yield-brownie-scripts--tests)\n  - [Testing our Defi Stake Yield Brownie Dapp](#testing-our-defi-stake-yield-brownie-dapp)\n  - [Front End \u002F Full Stack](#front-end--full-stack)\n- [Closing and Summary](#closing-and-summary)\n  - [Security](#security)\n  - [Where do I go now?](#where-do-i-go-now)\n    - [Learning More](#learning-more)\n    - [Community](#community)\n    - [Hackathons](#hackathons)\n    - [Vyper](#vyper)\n\n# Resources For This Course\n\n### Questions\n\n- [Github Discussions](https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Ffull-blockchain-solidity-course-py\u002Fdiscussions)\n  - Ask questions and chat about the course here!\n- [Stack Exchange Ethereum](https:\u002F\u002Fethereum.stackexchange.com\u002F)\n  - Great place for asking technical questions about Ethereum\n- [StackOverflow](https:\u002F\u002Fstackoverflow.com\u002F)\n  - Great place for asking technical questions overall\n\n### Windows Support\n\n- [Setup your windows environment](https:\u002F\u002Fmedium.com\u002F@cromewar\u002Fhow-to-setup-windows-10-11-for-smart-contract-development-and-brownie-e7d8d13555b3)\n  - Learn how to install all the tools you will need for this course on a windows machine\n\n### Hiccups\u002FIssues from the Video\n\n- [Chronological Issues from the Video](https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Ffull-blockchain-solidity-course-py\u002Fblob\u002Fmain\u002Fchronological-issues-from-video.md)\n  - A list of known hiccups\u002Fissues you may encounter while implementing the content from the video\n\n# Lesson 0: Welcome To Blockchain\n\n## What is a Blockchain?\n\n- [Bitcoin Whitepaper](https:\u002F\u002Fbitcoin.org\u002Fbitcoin.pdf)\n- [Ethereum Whitepaper](https:\u002F\u002Fethereum.org\u002Fen\u002Fwhitepaper\u002F)\n- [Hybrid Smart Contracts](https:\u002F\u002Fblog.chain.link\u002Fhybrid-smart-contracts-explained\u002F)\n- [Blockchain Oracles](https:\u002F\u002Fbetterprogramming.pub\u002Fwhat-is-a-blockchain-oracle-f5ccab8dbd72?source=friends_link&sk=d921a38466df8a9176ed8dd767d8c77d)\n- [What is a blockchain](https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fb\u002Fblockchain.asp)\n\n## Making Your First Transaction\n\n- [Metamask](https:\u002F\u002Fmetamask.io\u002F)\n- [Etherscan](https:\u002F\u002Fetherscan.io\u002F)\n- [Goerli Etherscan](https:\u002F\u002Fgoerli.etherscan.io\u002F)\n- [Kovan Etherscan](https:\u002F\u002Fkovan.etherscan.io\u002F)\n- [Goerli Faucet](https:\u002F\u002Ffaucets.chain.link\u002Fgoerli)\n- [Sepolia Faucet](https:\u002F\u002Fsepoliafaucet.com\u002F)\n- [Sepolia Etherscan](https:\u002F\u002Fsepolia.etherscan.io\u002F)\n\n- Rinkeby Faucet (Check the [link token contracts page](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Flink-token-contracts\u002F#rinkeby))\n  - NOTE: You can always find the most up to date faucets at [faucets.chain.link](https:\u002F\u002Ffaucets.chain.link\u002F).\n- OR, use the [Kovan ETH Faucet](https:\u002F\u002Ffaucets.chain.link\u002F), just be sure to swap your metamask to kovan!\n- [Gas and Gas Fees](https:\u002F\u002Fethereum.org\u002Fen\u002Fdevelopers\u002Fdocs\u002Fgas\u002F)\n- [Wei, Gwei, and Ether Converter](https:\u002F\u002Feth-converter.com\u002F)\n- [ETH Gas Station](https:\u002F\u002Fethgasstation.info\u002F)\n\n## How Do Blockchains Work?\n\n- [Blockchain Demo](https:\u002F\u002Fandersbrownworth.com\u002Fblockchain\u002F)\n- [Public \u002F Private Keys](https:\u002F\u002Fandersbrownworth.com\u002Fblockchain\u002Fpublic-private-keys\u002Fkeys)\n- [Layer 2 and Rollups](https:\u002F\u002Fethereum.org\u002Fen\u002Fdevelopers\u002Fdocs\u002Fscaling\u002Flayer-2-rollups\u002F)\n- [Decentralized Blockchain Oracles](https:\u002F\u002Fblog.chain.link\u002Fwhat-is-the-blockchain-oracle-problem\u002F)\n- [Block Rewards](https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fb\u002Fblock-reward.asp)\n- [Run Your Own Ethereum Node](https:\u002F\u002Fgeth.ethereum.org\u002Fdocs\u002Fgetting-started)\n\n### Consensus\n\n- [Consensus](https:\u002F\u002Fwiki.polkadot.network\u002Fdocs\u002Flearn-consensus)\n- [Proof of Stake](https:\u002F\u002Fethereum.org\u002Fen\u002Fdevelopers\u002Fdocs\u002Fconsensus-mechanisms\u002Fpos\u002F)\n- [Proof of Work](https:\u002F\u002Fethereum.org\u002Fen\u002Fdevelopers\u002Fdocs\u002Fconsensus-mechanisms\u002Fpow\u002F)\n- [Nakamoto Consensus](https:\u002F\u002Fblockonomi.com\u002Fnakamoto-consensus\u002F)\n\n## The Future\n\n- [Ethereum 2](https:\u002F\u002Fethereum.org\u002Fen\u002Feth2\u002F)\n\n## Miscellaneous\n\n- [DAOs](https:\u002F\u002Fwww.investopedia.com\u002Ftech\u002Fwhat-dao\u002F)\n\n# Lesson 1: [Welcome to Remix! Simple Storage](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fsimple_storage)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fsimple_storage\n\n### Everything in this section can be read about in the [Solidity Documentation](https:\u002F\u002Fdocs.soliditylang.org\u002Fen\u002Fv0.8.6\u002Findex.html)\n\n### [Remix](https:\u002F\u002Fremix.ethereum.org\u002F)\n\n### Basic Solidity\n\n- Versioning\n- Compiling\n- Contract Declaration\n- [Types & Declaring Variables](https:\u002F\u002Fdocs.soliditylang.org\u002Fen\u002Fv0.8.6\u002Ftypes.html)\n  - `uint256`, `int256`, `bool`, `string`, `address`, `bytes32`\n- Default Initializations\n- Comments\n- Functions\n- Deploying a Contract\n- Calling a public state-changing Function\n- [Visibility](https:\u002F\u002Fdocs.soliditylang.org\u002Fen\u002Fv0.7.3\u002Fcontracts.html#visibility-and-getters)\n- Scope\n- View & Pure Functions\n- Structs\n- Intro to Storage\n- Arrays - Dynamic & Fixed sized\n- Compiler Errors and Warnings\n- Memory\n- Mappings\n- SPDX License\n- Recap\n\n### Deploying to a \"Live\" network\n\n- A testnet or mainnet\n- [Find a faucet here](https:\u002F\u002Ffaucets.chain.link\u002F)\n- Connecting Metamask\n- Interacting with Deployed Contracts\n- The EVM\n\n# Lesson 2: [Storage Factory](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fstorage_factory)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fstorage_factory\n\n### Inheritance, Factory Pattern, and Interacting with External Contracts\n\n- Factory Pattern\n- Imports\n- Deploy a Contract From a Contract\n- Interact With a Deployed Contract\n- Recap\n\n# Lesson 3: [Fund Me](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Ffund_me)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Ffund_me\n\n### Payable, msg.sender, msg.value, Units of Measure\n\n- Payable\n- [Wei\u002FGwei\u002FEth Converter](https:\u002F\u002Feth-converter.com\u002F)\n- msg.sender & msg.value\n\n### Chainlink Oracles\n\n- Decentralized Oracle Network Chainlink\n  - Blockchains can't make API calls\n  - Centralized Nodes are Points of Failure\n- [data.chain.link](https:\u002F\u002Fdata.chain.link\u002F)\n- Getting External Data with Chainlink Oracles\n  - [Chainlink](https:\u002F\u002Fdocs.chain.link\u002F)\n  - [Faucets and Contract Addresses](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Flink-token-contracts\u002F)\n    - [Kovan](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Flink-token-contracts\u002F#kovan)\n  - [Getting Price Information](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Fget-the-latest-price\u002F)\n\n### Importing from NPM and Advanced Solidity\n\n- Decimals\u002FFloating Point Numbers in Solidity\n- latestRoundData\n- Importing from NPM in Remix\n- Interfaces\n  - Introduction to ABIs\n- [Getting Price Feed Addresses](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Freference-contracts\u002F)\n- getPrice\n- Tuples\n  - Unused Tuple Variables\n- Matching Units (WEI\u002FGWEI\u002FETH)\n- getConversionRate\n- Matching Units (Continued)\n- SafeMath & Integer Overflow\n  - using keyword\n  - [Libraries](https:\u002F\u002Fdocs.soliditylang.org\u002Fen\u002Fv0.8.6\u002Fcontracts.html#libraries)\n  - SafeMath PSA\n- Setting a Threshold\n- Require\n- Revert\n- Withdraw Function\n- Transfer\n- Balance\n- this\n- Contract Owners\n- Constructor\n- ==\n- Modifiers\n- Resetting\n- for loop\n- Array Length\n- Forcing a Transaction\n- Recap\n\n# Lesson 4: [Web3.py Simple Storage](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fweb3_py_simple_storage)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fweb3_py_simple_storage\n\n### Installing VSCode, Python, and Web3\n\n- [Developer Bootcamp Setup Instructions (metamask, vscode, python, nodejs..)](https:\u002F\u002Fchain.link\u002Fbootcamp\u002Fbrownie-setup-instructions)\n- [VSCode](https:\u002F\u002Fcode.visualstudio.com\u002Fdownload)\n- [VSCode Crash Course](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=WPqXP_kLzpo)\n- Extensions\n- Short Cuts:\n  - [VSCode Shortcuts](https:\u002F\u002Fcode.visualstudio.com\u002Fdocs\u002Fgetstarted\u002Fkeybindings)\n  - [VSCode MacOS Shortcuts](https:\u002F\u002Fcode.visualstudio.com\u002Fshortcuts\u002Fkeyboard-shortcuts-macos.pdf)\n- [Python](https:\u002F\u002Fwww.python.org\u002Fdownloads\u002F)\n  - Install Troubleshooting\n- Terminal\n- Making a directory\u002FFolder\n- Opening the folder up with VSCode\n- Creating a new file\n- Syntax Highlights\n- Remember to save!\n- Setting linting compile version\n- VSCode Solidity Settings\n  - Formatting & Format on Save\n  - Solidity Prettier\n  - [Python Black](https:\u002F\u002Fpypi.org\u002Fproject\u002Fblack\u002F)\n  - [pip](https:\u002F\u002Fpypi.org\u002Fproject\u002Fpip\u002F)\n\n### Our First Python Script with Web3.py - Deploying a Contract\n\n- Reading our solidity file\n- Running a Python Script in the Terminal\n- [MaxOS Shortcuts](https:\u002F\u002Fcode.visualstudio.com\u002Fshortcuts\u002Fkeyboard-shortcuts-macos.pdf)\n- [Windows Shortcuts](https:\u002F\u002Fcode.visualstudio.com\u002Fshortcuts\u002Fkeyboard-shortcuts-windows.pdf)\n- [Linux Shortcuts](https:\u002F\u002Fcode.visualstudio.com\u002Fshortcuts\u002Fkeyboard-shortcuts-linux.pdf)\n- Compiling in Python\n- [py-solc-x](https:\u002F\u002Fpypi.org\u002Fproject\u002Fpy-solc-x\u002F)\n  - compile_standard\n- Colorized Brackets\n- JSON ABI\n- Saving Compiled Code\n- Formatting JSON\n- Deploying in Python\n  1. Get Bytecode\n  2. Get ABI\n  3. Choose Blockchain to Deploy To\n  - Local Ganache Chain\n    - [Ganache UI](https:\u002F\u002Fwww.trufflesuite.com\u002Fganache)\n    - [Ganache Command Line](https:\u002F\u002Fgithub.com\u002Ftrufflesuite\u002Fganache-cli)\n- [Web3.py](https:\u002F\u002Fweb3py.readthedocs.io\u002Fen\u002Fstable\u002F)\n- HTTP \u002F RPC Provider\n- Private Keys MUST start with \"0x\"\n- Contract Object\n- Building a Transaction\n- Account Nonce\n- Calling \"Constructor\"\n- Transaction Parameters\n- Signing the Transaction\n- NEVER put your private key directly in your code\n- [Setting Environment Variables (Windows, Linux, MacOS)](https:\u002F\u002Fwww.twilio.com\u002Fblog\u002F2017\u002F01\u002Fhow-to-set-environment-variables.html)\n  - [More on Windows Environment Variables](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=tqWDiu8a4gc&t=40s)\n- Exported Environment Variables Only Last the Duration of the Shell\u002FTerminal\n- Private Key PSA\n- .env file\n- .gitignore\n- Loading .env File in Python\n  - [python-dotenv](https:\u002F\u002Fpypi.org\u002Fproject\u002Fpython-dotenv\u002F)\n- Viewing our Transaction \u002F Deployment in Ganache\n- Waiting for Block Confirmations\n\n### Interacting with Our Contract in Python & Web3.py\n\n- 2 Things you always need\n  1. Contract Address\n  2. Contract ABI\n- Getting address from transaction receipt\n- Calling a view function with web3.py\n  - Call vs Transact\n- Updating State with Web3.py\n- [ganache-cli](https:\u002F\u002Fgithub.com\u002Ftrufflesuite\u002Fganache-cli)\n  - Installing Ganache\n    - [Install Nodejs](https:\u002F\u002Fnodejs.org\u002Fen\u002F)\n    - [Install Yarn](https:\u002F\u002Fclassic.yarnpkg.com\u002Fen\u002Fdocs\u002Finstall)\n- Working with ganache-cli\n- Open a new terminal in the same window\n- Deploying to a testnet\n- [Infura](https:\u002F\u002Finfura.io\u002F)\n- [Alchemy](https:\u002F\u002Fwww.alchemy.com\u002F)\n- Using Infura RPC URL \u002F HTTP Provider\n- [Chain Ids](https:\u002F\u002Fchainlist.org\u002F)\n- Wow this seems like a lot of work... Is there a better way?\n\n# Lesson 5: [Brownie Simple Storage](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fbrownie_simple_storage)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fbrownie_simple_storage\n\n### Brownie Introduction\n\n- Some Users:\n  - https:\u002F\u002Fyearn.finance\u002F\n  - https:\u002F\u002Fcurve.fi\u002F\n  - https:\u002F\u002Fbadger.finance\u002F\n\n### Installing Brownie\n\n- [Installing Brownie](https:\u002F\u002Feth-brownie.readthedocs.io\u002Fen\u002Fstable\u002Finstall.html)\n  - Install pipx\n  - pipx install eth-brownie\n  - Testing Successful Install\n\n### Brownie Simple Storage Project\n\n- A new Brownie project with `brownie init`\n  - Project Basic Explanation\n- Adding `SimpleStorage.sol` to the `contracts` folder\n- Compiling with `brownie compile`\n- Brownie deploy script\n  - `def main` is brownie's entry point\n- brownie defaults to a `development` `ganache` chain that it creates\n- Placing functions outside of the `main` function\n- brownie `accounts`\n  - 3 Ways to Add Accounts\n    1. `accounts[0]`: Brownie's \"default\" ganache accounts\n       - Only works for local ganache\n    2. `accounts.load(\"...\")`: Brownie's encrypted command line (MOST SECURE)\n       - Run `brownie accounts new \u003Cname>` and enter your private key and a password\n    3. `accounts.add(config[\"wallets\"][\"from_key\"])`: Storing Private Keys as an environment variable, and pulling from our `brownie-config.yaml`\n       - You'll need to add `dotenv: .env` to your `brownie-config.yaml` and have a `.env` file\n- Importing a Contract\n- Contract.Deploy\n- View Function Call in Brownie\n- State-Changing Function Call in Brownie \u002F Contract Interaction\n- `transaction.wait(1)`\n\n### Testing Basics\n\n- `test_simple_storage.py`\n- Arrange, Act, Assert\n- [`assert`](https:\u002F\u002Fdocs.pytest.org\u002Fen\u002F6.2.x\u002Fassert.html)\n- `brownie test`\n- `test_updating_storage`\n- [Pytest \u002F Brownie Test Tips](https:\u002F\u002Fdocs.pytest.org\u002Fen\u002F6.2.x\u002F)\n- Deploy to a Testnet\n- `brownie networks list`\n- Development vs Ethereum\n  - Development is temporary\n  - Ethereum networks persist\n- RPC URL \u002F HTTP Provider in Brownie\n- The network flag\n  - `list index out of range`\n- `get_account()`\n- `networks.show_active()`\n- build\u002Fdeployments\n- Accessing previous deployments\n- Interacting with contracts deployed in our brownie project\n\n### [Brownie console]\n\n- `brownie console`\n\n# Lesson 6: [Brownie Fund Me](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fbrownie_fund_me)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fbrownie_fund_me\n\n### Introduction\n\n- Setup\n\n### Dependencies, Deploying, and Networks\n\n- Dependencies\n- [chainlink-brownie-contracts](https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Fchainlink-brownie-contracts)\n- remappings\n- Deploy Script (V1)\n- `helpful_scripts.py`\n- `__init__.py`\n- Deploy to Rinkeby\n- Contract Verification (`publish_source`)\n  - The Manual Way\n    - \"Flattening\"\n  - The Programmatic Way\n    - Getting an [Etherscan API Key](https:\u002F\u002Fetherscan.io\u002Fapis)\n    - `ETHERSCAN_TOKEN`\n  - Interacting with Etherscan\n- Deploying to Local Chains\n- Introduction to Mocking\n- Constructor Parameters\n- `networks` in our `brownie-config.yaml`\n- Copying [Mock Contracts from chainlink-mix](https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Fchainlink-mix)\n- Deploying and using our mock\n- Refactoring\n- Deploying to a persistent ganache\n- brownie attach\n- Adding a persistent brownie network\n- resetting a network build\n\n### Funding and Withdrawing Python Scripts\n\n- Whoops! Let's fix an issue...\n- Fund Script\n- Withdraw Script\n\n### Testing across networks\n\n- `test_can_fund_and_withdraw`\n- default networks\n- pytest `pip install pytest`\n- pytest.skip\n- brownie exceptions\n- `mainnet-fork`\n- Custom mainnet fork\n- Adding a development brownie network\n  - `brownie networks add development mainnet-fork-dev cmd=ganache-cli host=http:\u002F\u002F127.0.0.1 fork='https:\u002F\u002Finfura.io\u002Fv3\u002F$WEB3_INFURA_PROJECT_ID' accounts=10 mnemonic=brownie port=8545`\n- [Alchemy](https:\u002F\u002Fwww.alchemy.com\u002F)\n- `brownie test --network mainnet-fork`\n- brownie ganache vs local ganache vs mainnet-fork vs testnet...\n\n### Git\n\n- [Installing Git](https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGetting-Started-Installing-Git)\n- Creating a repository\n- [First time with git](https:\u002F\u002Fgit-scm.com\u002Fbook\u002Fen\u002Fv2\u002FGetting-Started-First-Time-Git-Setup)\n- [Adding our project to github](https:\u002F\u002Fdocs.github.com\u002Fen\u002Fgithub\u002Fimporting-your-projects-to-github\u002Fimporting-source-code-to-github\u002Fadding-an-existing-project-to-github-using-the-command-line)\n- Tweet it out!\n\n### Compatibility with Ganache UI\n\n- `test_only_owner_can_withdraw()` gives below error if the selected network is Ganache UI::\n\n```\nE           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.\n```\n\n[More information here.](https:\u002F\u002Fethereum.stackexchange.com\u002Fquestions\u002F114889\u002Fdeploying-ganache-local-w-brownie-vm-exception-while-processing-transaction-in)\n\n# Lesson 7: [SmartContract Lottery](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fsmartcontract-lottery)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fsmartcontract-lottery\n\n[Chainlink VRF v1 docs](https:\u002F\u002Fdocs.chain.link\u002Fvrf\u002Fv1\u002Fexamples\u002Fget-a-random-number)\n\n### Introduction\n\n- Add a `README.md`\n- Defining the project\n- Is it decentralized?\n\n### `Lottery.sol`\n\n- basic setup\n- Main Functions\n- address payable[]\n- getEntranceFee & Setup\n  - [Chainlink Price Feed](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Fget-the-latest-price\u002F)\n  - brownie-config\n  - SPDX\n- Matching Units of Measure\n  - Can't just divide\n- Test early and often\n- Quick Math Sanity Check\n- deleting networks\n- [Alchemy](https:\u002F\u002Fwww.alchemy.com\u002F) again\n- Enum\n- `startLottery`\n- [Openzeppelin](https:\u002F\u002Fopenzeppelin.com\u002Fcontracts\u002F)... Is this the first openzeppelin reference?\n- [Openzeppelin Contracts Github](https:\u002F\u002Fgithub.com\u002FOpenZeppelin\u002Fopenzeppelin-contracts)\n- Randomness\n- Pseudorandomness\n- `block` keyword\n  - `block.difficulty`\n  - `block.timestamp`\n- `keccack256`\n- [True Randomness with Chainlink VRF](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Fget-a-random-number\u002F)\n- [VRFConsumerBase.sol](https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Fchainlink\u002Fblob\u002Fdevelop\u002Fcontracts\u002Fsrc\u002Fv0.8\u002Fvrf\u002FVRFConsumerBase.sol)\n- Chainlink VRF Remix Version\n- Inheriting Constructors\n- Oracle Gas & Transaction Gas\n- [Why didn't we pay gas on the price feeds?](https:\u002F\u002Fethereum.stackexchange.com\u002Fquestions\u002F87473\u002Fis-chainlinks-price-reference-data-free-to-consume)\n- Chainlink Node Fees\n- [Request And Receive Introduction](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Farchitecture-request-model\u002F)\n- [Kovan Faucets](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Flink-token-contracts\u002F#kovan)\n- Funding Chainlink Contracts\n- [Request And Receive Explanation](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Farchitecture-request-model\u002F)\n- A Clarification\n- `endLottery`\n- `returns (type variableName)`\n- `fulfillRandomness`\n- `override`\n- Modulo Operation (Mod Operation %)\n- Paying the lottery winner\n- Resetting the lottery\n\n### Testing Lottery.sol\n\n- `deploy_lottery.py`\n- `get_account()` refactored\n- `get_contract`\n  - `contract_to_mock`\n  - `Contract.from_abi`\n- Adding the parameters to deploying to lottery\n- `vrfCoordinatorMock` and adding mocks\n- `LinkToken` and Mocks\n- Successful Ganache Deployment!\n- Python Lottery Scripts\u002FFunctions\n  - `start_lottery`\n  - Brownie tip: Remember to `tx.wait(1)` your last transaction\n  - `enter_lottery`\n  - `end_lottery`\n- Funding with LINK\n- brownie interfaces\n- Waiting for callback\n- Integration Tests & Unit Tests\n- Test all lines of code\n- `test_get_entrance_fee`\n- `pytest.skip` (again)\n- `test_cant_enter_unless_started`\n- `test_can_start_and_enter_lottery`\n- `test_can_pick_winner_correctly`\n- Events and Logs\n- `callBackWithRandomness`\n\n### Lottery.sol Testnet Deployment\n\n- `topics`\n- [conftest.py](https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F34466027\u002Fin-pytest-what-is-the-use-of-conftest-py-files)\n\n# Lesson 8: [Chainlink Mix](https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Fchainlink-mix)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Fchainlink-mix\n\n## [Brownie Mixes](https:\u002F\u002Fgithub.com\u002Fbrownie-mix)\n\n# Lesson 9: [ERC20s, EIPs, and Token Standards](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Ferc20-brownie-py)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Ferc20-brownie-py\n\n- [ERC20\u002FEIP20 Standard](https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-20)\n- What is an ERC20?\n- Creating an ERC20\n- [OpenZeppelin ERC20](https:\u002F\u002Fdocs.openzeppelin.com\u002Fcontracts\u002F2.x\u002Fapi\u002Ftoken\u002Ferc20)\n- [Solidity 0.8](https:\u002F\u002Fdocs.soliditylang.org\u002Fen\u002Fbreaking\u002F080-breaking-changes.html)\n- I Challenge you to code this yourself!\n- `deploy_token.py`\n- Copy paste `helpful_scripts.py`\n- Viewing our token in metamask\n- Adding to an exchange\n\n# Lesson 10: [Defi & Aave](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Faave_brownie_py_freecode)\n\n\\*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.\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Faave_brownie_py_freecode\n\n### Defi Intro\n\n- [Defipulse](https:\u002F\u002Fdefipulse.com\u002F)\n- [Defillama](https:\u002F\u002Fdefillama.com\u002F)\n- [Aave Testnet Site](https:\u002F\u002Fstaging.aave.com\u002F)\n- [Paraswap](https:\u002F\u002Fparaswap.io\u002F)\n- Decentralized Exchange\n\n### Aave UI\n\n- [Kovan ETH](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Flink-token-contracts\u002F#kovan)\n- What is Aave?\n- Borrowing and Lending\n- Connecting to Aave\n- Depositing Tokens \u002F Lending\n- Checking your transaction is correct\n- WETH Gateway\n- Interest Bearing Token (aToken)\n- Collateral\n- [DAI](https:\u002F\u002Fmakerdao.com\u002Fen\u002F)\n- [Stablecoin](https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fs\u002Fstablecoin.asp)\n- [Wrapped Bitcoin (wBTC)](https:\u002F\u002Fwww.gemini.com\u002Fcryptopedia\u002Fwrapped-bitcoin-what-can-you-do)\n- [Why borrow tokens?](https:\u002F\u002Fdocs.aave.com\u002Ffaq\u002Fborrowing)\n- [Blockchain Fintech Tutorial](https:\u002F\u002Fblog.chain.link\u002Fblockchain-fintech-defi-tutorial-lending-borrowing-python\u002F)\n- DISCLAIMER ABOUT BORROWING\n- Borrowing Tokens\n- [Liquidations](https:\u002F\u002Fdocs.aave.com\u002Ffaq\u002Fliquidations)\n- Your health factor must be above 1\n- [Solvent](https:\u002F\u002Fwww.investopedia.com\u002Fterms\u002Fs\u002Fsolvency.asp)\n- [Stable vs Variable Interest Rate](https:\u002F\u002Fdocs.aave.com\u002Ffaq\u002Fborrowing#what-is-the-difference-between-stable-and-variable-rate)\n- Repaying our borrows\u002Floans\n- Reward token \u002F governance token\n- Governance\n\n### [Programmatic Interactions with Aave](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Faave_brownie_py_freecode)\n\n- Quant Defi Engineer\n- [Aave Documentation](https:\u002F\u002Fdocs.aave.com\u002Fdevelopers\u002F)\n- Setup\n- Converting ETH -> WETH\n- `get_weth.py`\n- [IWETH](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Faave_brownie_py\u002Fblob\u002Fmain\u002Finterfaces\u002FWethInterface.sol)\n- [Kovan WETH Token Address: 0xd0a1e359811322d97991e03f863a0c30c2cf029c](https:\u002F\u002Fkovan.etherscan.io\u002Ftoken\u002F0xd0a1e359811322d97991e03f863a0c30c2cf029c)\n- [Mainnet WETH Token Address: 0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2](https:\u002F\u002Fetherscan.io\u002Ftoken\u002F0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2)\n- Converting WETH -> ETH with `withdraw`\n- `aave_borrow.py`\n- [LendingPool](https:\u002F\u002Fdocs.aave.com\u002Fdevelopers\u002Fthe-core-protocol\u002Flendingpool)\n- [LendingPoolAddressProvider](https:\u002F\u002Fdocs.aave.com\u002Fdevelopers\u002Fthe-core-protocol\u002Faddresses-provider)\n- [LendingPool and LendingPoolAddressProvider Addresses](https:\u002F\u002Fdocs.aave.com\u002Fdevelopers\u002Fdeployed-contracts\u002Fdeployed-contracts)\n- Fixing import dependencies\n- [Aave Github](https:\u002F\u002Fgithub.com\u002Faave\u002Fprotocol-v2)\n- [ERC20 Approve Function](https:\u002F\u002Fmedium.com\u002Fethex-market\u002Ferc20-approve-allow-explained-88d6de921ce9)\n- [IERC20 from Patrick's repo](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Faave_brownie_py\u002Fblob\u002Fmain\u002Finterfaces\u002FIERC20.sol)\n- `deposit`\n- [getUserAccountData](https:\u002F\u002Fdocs.aave.com\u002Fdevelopers\u002Fthe-core-protocol\u002Flendingpool#getuseraccountdata)\n- Liquidation Threshold\n- [Risk Parameters](https:\u002F\u002Fdocs.aave.com\u002Frisk\u002Fasset-risk\u002Frisk-parameters)\n- Borrowing DAI\n- Getting DAI Conversion Rate\n  - [Chainlink Price Feeds](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Freference-contracts\u002F)\n  - [AggregatorV3Interface](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Faave_brownie_py\u002Fblob\u002Fmain\u002Finterfaces\u002FAggregatorV3Interface.sol)\n- [borrow](https:\u002F\u002Fdocs.aave.com\u002Fdevelopers\u002Fthe-core-protocol\u002Flendingpool#borrow)\n- [Mainnet DAI Address: 0x6b175474e89094c44da98b954eedeac495271d0f](https:\u002F\u002Fetherscan.io\u002Ftoken\u002F0x6b175474e89094c44da98b954eedeac495271d0f)\n- [Aave Testnet Token Addresses](https:\u002F\u002Faave.github.io\u002Faave-addresses\u002Fkovan.json)\n- Repaying\n- Kovan Run\n- Viewing the transactions\n\n### Testing\n\n# Lesson 11: [NFTs](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fnft-demo)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fnft-demo\n\n### Non-Technical Explainer\n\n- [End-to-end article](https:\u002F\u002Fwww.freecodecamp.org\u002Fnews\u002Fhow-to-make-an-nft-and-render-on-opensea-marketplace\u002F)\n- What is an NFT?\n- [ERC721](https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-721)\n- Token URI\n- [Token Metadata Example](https:\u002F\u002Fdocs.opensea.io\u002Fdocs\u002F2-adding-metadata)\n- [IPFS](https:\u002F\u002Fipfs.io\u002F)\n\n### Simple NFT\n\n- [brownie mix](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fnft-mix)\n- Initial Setup\n- `SimpleCollectible.sol`\n- [OpenZeppelin ERC721](https:\u002F\u002Fdocs.openzeppelin.com\u002Fcontracts\u002F3.x\u002F)\n- [Pug Image](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fnft-mix\u002Fblob\u002Fmain\u002Fimg\u002Fpug.png)\n- NFT Constructor\n- NFT is a type of factory pattern\n- `createCollectible`\n  - `_safeMint`\n- TokenURI & Metadata\n- Opensea listing example\n- Is this decentralized?\n- Ethereum Size and dStorage\n  - [Ethereum Size](https:\u002F\u002Fycharts.com\u002Findicators\u002Fethereum_chain_full_sync_data_size)\n  - [dStorage Solutions](https:\u002F\u002Fethereum.org\u002Fen\u002Fdevelopers\u002Fdocs\u002Fstorage\u002F)\n  - [IPFS](https:\u002F\u002Fwww.ipfs.com\u002F)\n- You need to have your NFT attributes both on-chain and inside your tokenURI metadata\n- `deploy_and_create.py`\n- [TokenURI used for the demo: https:\u002F\u002Fipfs.io\u002Fipfs\u002FQmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=0-PUG.json](https:\u002F\u002Fipfs.io\u002Fipfs\u002FQmd9MCGtdVz2miNumBHDbvj8bigSgTwnr4SbyH6DNnpWdt?filename=0-PUG.json)\n- [IPFS Companion](https:\u002F\u002Fchrome.google.com\u002Fwebstore\u002Fdetail\u002Fipfs-companion\u002Fnibjojkomfdiaoajekhjakgkdhaomnch?hl=en)\n- Rinkeby Deployment\n- [Opensea Example](https:\u002F\u002Ftestnets.opensea.io\u002Fassets\u002F0x8acb7ca932892eb83e4411b59309d44dddbc4cdf\u002F0)\n\n### SimpleCollectible Testing\n\n- What else with NFTs?\n\n### Advanced NFT\n\n- `AdvancedCollectible.sol`\n- [Dungeons and Dragons Example](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fdungeons-and-dragons-nft)\n- Double Inherited Constructors\n- `createCollectible` (Advanced)\n  - `tokenIdToBreed`\n- Working with in-flight Chainlink VRF requests\n- Download the NFT images from the [nft-mix](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fnft-mix)\n- `setTokenURI`\n  - `_isApprovedOrOwner`\n- Emit events when you update mappings\n- [`indexed` event keyword](https:\u002F\u002Fethereum.stackexchange.com\u002Fquestions\u002F8658\u002Fwhat-does-the-indexed-keyword-do\u002F8659)\n\n### Advanced deploy_and_create\n\n- Move `OPENSEA_URL` to `helpful_scripts`\n- Deploying AdvancedCollectible\n  - Opensea testnet is only compatible with Rinkeby\n- [Rinkeby Chainlink VRF Contract Addresses](https:\u002F\u002Fdocs.chain.link\u002Fdocs\u002Fvrf-contracts\u002F#rinkeby)\n- Speeding through adding functions from previous projects\n- Deploy to Rinkeby\n- `create_collectible.py`\n- A quick unit test\n- A quick integration test\n\n### Creating Metadata & IPFS\n\n- `create_metadata.py`\n- `get_breed`\n- Metadata Folder\n- `metadata_template`\n- NFT Metadata Attributes\n- Checking if Metadata file already exists\n- Uploading to IPFS\n  - `upload_to_ipfs`\n  - [Download IPFS Command Line](https:\u002F\u002Fdocs.ipfs.io\u002Finstall\u002Fcommand-line\u002F)\n  - [Download IPFS Desktop](https:\u002F\u002Fdocs.ipfs.io\u002Finstall\u002Fipfs-desktop\u002F)\n  - [HTTP IPFS Docs](https:\u002F\u002Fdocs.ipfs.io\u002Freference\u002Fhttp\u002Fapi\u002F)\n  - `ipfs daemon`\n  - [Pinata](https:\u002F\u002Fapp.pinata.cloud\u002F)\n  - [Pinata Docs](https:\u002F\u002Fdocs.pinata.cloud\u002F)\n  - Refactoring to not re-upload to IPFS\n- Setting the TokenURI\n- End-To-End Manual Testnet Test\n- Viewing on Opensea\n\n# Lesson 12: [Upgrades](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fupgrades-mix)\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fupgrades-mix\n\n### Introduction to upgrading smart contracts\n\n- [Original Video](https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=bdXJmWajZRY)\n- Smart Contracts can be upgraded!\n- Does this mean they are not immutable?\n- [Trail of Bits on Upgradeable Smart Contracts](https:\u002F\u002Fblog.trailofbits.com\u002F2018\u002F09\u002F05\u002Fcontract-upgrade-anti-patterns\u002F)\n- The \"Not Really Upgrading\" \u002F Parameterization Method\n- The Social Yeet \u002F Migration Method\n- [Contract Migration](https:\u002F\u002Fblog.trailofbits.com\u002F2018\u002F10\u002F29\u002Fhow-contract-migration-works\u002F)\n- Proxies\n  - DelegateCall\n  - Terminology:\n    - Implementation Contract\n    - Proxy Contract\n    - User\n    - Admin\n  - Gotchas:\n    - Storage Clashes\n    - Function Selector\n    - Function Selector Clashes\n  - Proxy Patterns:\n    - [Transparent Proxy Pattern](https:\u002F\u002Fblog.openzeppelin.com\u002Fthe-transparent-proxy-pattern\u002F)\n    - [Universal Upgrade Proxy Standard](https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-1822)\n    - [Diamond\u002FMulti-Facet Proxy](https:\u002F\u002Feips.ethereum.org\u002FEIPS\u002Feip-2535)\n\n### Upgrades-mix and code\n\n- Setup\n- `Box.sol`\n- `BoxV2.sol`\n- Getting the proxy contracts\n- [Openzeppelin Proxy Github](https:\u002F\u002Fgithub.com\u002FOpenZeppelin\u002Fopenzeppelin-contracts\u002Ftree\u002Fmaster\u002Fcontracts\u002Fproxy\u002Ftransparent)\n- `01_deploy_box.py`\n- Hooking up a proxy to our implementation contract\n- (Optional) [Creating a Gnosis Safe](https:\u002F\u002Fhelp.gnosis-safe.io\u002Fen\u002Farticles\u002F3876461-create-a-safe)\n- Initializers\n- Encoding Initializer Function\n- Assigning ABI to a proxy\n- Running the script\n- Upgrade Python Function\n\n### Testing Upgrades\n\n- Testing our proxy\n- Testing our upgrades\n\n### Upgrades on a testnet\n\n# Bonus Lesson 13: [Full Stack Defi](https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fdefi-stake-yield-brownie-freecode)\n\n_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\u002Fjavascript video._\n\n_Link to hardhat\u002Fjavascript video with more full-stack examples: https:\u002F\u002Fgithub.com\u002Fsmartcontractkit\u002Ffull-blockchain-solidity-course-js_\n\n💻 Code: https:\u002F\u002Fgithub.com\u002FPatrickAlphaC\u002Fdefi-stake-yield-brownie-freecode\n\n- [FreeCodeCamp React](https:\u002F\u002Fwww.freecodecamp.org\u002Fnews\u002Ftag\u002Freact\u002F)\n- What are we building?\n- Setup\n- `DappToken.sol`\n- `TokenFarm.sol`\n  - `tokenIsAllowed`\n  - `addAllowedTokens`\n  - mapping of a mapping\n  - `stakeTokens`\n  - `issueTokens`\n  - `getUserTotalValue`\n  - `getUserSingleTokenValue`\n  - `getTokenValue`\n  - `setPriceFeedContract`\n  - `unStakeTokens`\n  - Can this be reentrancy attacked?\n\n### Defi Stake Yield Brownie Scripts & Tests\n\n- `deploy.py`\n  - Deploying DappToken\n  - Deploying TokenFarm\n  - Adding allowed tokens\n- [ERC20 Kovan Faucet](https:\u002F\u002Ferc20faucet.com\u002F)\n  - If the link above does not work, you can get another ERC20 token using this faucet: [Weenus ERC20 Faucet](https:\u002F\u002Fgithub.com\u002Fbokkypoobah\u002FWeenusTokenFaucet)\n- Mocking our ERC20s\n\n### Testing our Defi Stake Yield Brownie Dapp\n\n- `test_set_price_feed_contract`\n- `test_stake_tokens`\n- Fixtures\n- `test_issue_tokens`\n- Now you try on tests!\n\n### Front End \u002F Full Stack\n\n- Front End Introduction\n- Typescript\n- [React](https:\u002F\u002Freactjs.org\u002F)\n- [useDapp](https:\u002F\u002Fusedapp.readthedocs.io\u002Fen\u002Flatest\u002F)\n- [npx](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fnpx)\n- [yarn](https:\u002F\u002Fclassic.yarnpkg.com\u002Fen\u002Fdocs\u002Finstall\u002F)\n- `create-react-app`\n  - Layout\n- [Testing Front End](https:\u002F\u002Fwww.freecodecamp.org\u002Fnews\u002Ftesting-react-hooks\u002F)\n- yarn && yarn start\n- Connecting our wallets\n  - Install useDapp\n  - Header Component\n  - Connect Button\n- [Material-UI](https:\u002F\u002Fmaterial-ui.com\u002F)\n- Making our button nicer\n- `Main.tsx`\n  - Sending `brownie-config` & `build` folder to our UI\n  - Helper Config\n  - TypeScript error suppression\n  - Getting addresses\n  - [Ethers](https:\u002F\u002Fdocs.ethers.io\u002Fv5\u002F)\n  - Only support kovan\n- `YourWallet`\n  - `supportedTokens`\n  - State Hooks\n  - Showing tokens\n  - `WalletBalance`\n  - [`ethersproject\u002Funits`](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002F@ethersproject\u002Funits)\n  - `BalanceMsg`\n  - Stake Form\n  - Calling `approve`\n  - `useContractFunction`\n  - `useEffect`\n  - Notifications\n  - Make it pretty\n  - Alerts\n\nShoutout to [Matt](https:\u002F\u002Ftwitter.com\u002Fmdurkin92) for the help on the front end!\n\n# Closing and Summary\n\n## Security\n\n- [Best Practices](https:\u002F\u002Fconsensys.github.io\u002Fsmart-contract-best-practices\u002F)\n- [Attacks](https:\u002F\u002Fconsensys.github.io\u002Fsmart-contract-best-practices\u002Fattacks\u002F)\n  - [Oracle Attacks](https:\u002F\u002Fhackernoon.com\u002Fhow-dollar100m-got-stolen-from-defi-in-2021-price-oracle-manipulation-and-flash-loan-attacks-explained-3n6q33r1)\n  - [Re-entrancy Attacks](https:\u002F\u002Fquantstamp.com\u002Fblog\u002Fwhat-is-a-re-entrancy-attack)\n- [Damn Vulnerable Defi](https:\u002F\u002Fwww.damnvulnerabledefi.xyz\u002F)\n- [Ethernaut](https:\u002F\u002Fethernaut.openzeppelin.com\u002F)\n- Some Auditors\n  - [OpenZeppelin](https:\u002F\u002Fopenzeppelin.com\u002F)\n  - [SigmaPrime](https:\u002F\u002Fsigmaprime.io\u002F)\n  - [Trail of Bits](https:\u002F\u002Fwww.trailofbits.com\u002F)\n\n## Where do I go now?\n\n### Learning More\n\n- [CryptoZombies](https:\u002F\u002Fcryptozombies.io\u002F)\n- [Dapp University](https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCY0xL8V6NzzFcwzHCgB8orQ)\n- [ChainShot](https:\u002F\u002Fwww.chainshot.com\u002Fcourses)\n- [Ivan on Tech](https:\u002F\u002Facademy.ivanontech.com\u002F)\n- [Eat the Blocks](https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCZM8XQjNOyG2ElPpEUtNasA)\n- [Patrick Collins](https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUCn-3f8tw_E1jZvhuHatROwA)\n- [Austin Griffith](https:\u002F\u002Fwww.youtube.com\u002Fchannel\u002FUC_HI2i2peo1A-STdG22GFsA)\n- [Nader Dabit](https:\u002F\u002Fwww.youtube.com\u002Fuser\u002Fboyindasouth)\n- [Ethereum.org](https:\u002F\u002Fethereum.org\u002Fen\u002F)\n\n### Community\n\n- Twitter\n- [Brownie Discord](https:\u002F\u002Fdiscord.gg\u002F9zk7snTfWe)\n- [Ethereum Discord](https:\u002F\u002Fethereum.org\u002Fen\u002F)\n- [Chainlink Discord](https:\u002F\u002Fdiscord.gg\u002F2YHSAey)\n- [Reddit ethdev](https:\u002F\u002Fwww.reddit.com\u002Fr\u002Fethdev\u002F)\n\n### Hackathons\n\n- [CL Hackathon](https:\u002F\u002Fchain.link\u002Fhackathon)\n- [ETH Global](https:\u002F\u002Fethglobal.co\u002F)\n- [ETH India](https:\u002F\u002Ftwitter.com\u002FETHIndiaco)\n\nBe sure to check out project grant programs!\n\n### Vyper\n\n[From solidity course to vyper](https:\u002F\u002Fgithub.com\u002Fchalex-eth\u002FFrom-solidity-course-to-vyper-py)\n\nAnd make today an amazing day!\n","该项目提供了一门从初学者到专家级别的Solidity、区块链和智能合约完整课程的Python版本。它通过一系列精心设计的课程，教授如何使用Solidity编写智能合约，并利用Web3.py与以太坊区块链进行交互。项目涵盖了基本的Solidity语法、Remix IDE的使用、智能合约部署以及更高级的主题如继承、工厂模式、Chainlink预言机等。特别适合希望深入了解区块链技术并掌握智能合约开发技能的开发者或学生。此外，项目还提供了丰富的资源链接及常见问题解答，帮助学习者克服遇到的技术障碍。",2,"2026-06-11 03:28:45","top_topic"]