# Foundry DeFi Stablecoin This is a section of the Cyfrin Foundry Solidity Course. [DSCEngine Example](https://sepolia.etherscan.io/address/0x091ea0838ebd5b7dda2f2a641b068d6d59639b98#code) [Decentralized Stablecoin Example](https://sepolia.etherscan.io/address/0xf30021646269007b0bdc0763fd736c6380602f2f#code) # About This project is meant to be a stablecoin where users can deposit WETH and WBTC in exchange for a token that will be pegged to the USD. - [Foundry DeFi Stablecoin](#foundry-defi-stablecoin) - [About](#about) - [Getting Started](#getting-started) - [Requirements](#requirements) - [Quickstart](#quickstart) - [Optional Gitpod](#optional-gitpod) - [Updates](#updates) - [Usage](#usage) - [Start a local node](#start-a-local-node) - [Deploy](#deploy) - [Deploy - Other Network](#deploy---other-network) - [Testing](#testing) - [Test Coverage](#test-coverage) - [Deployment to a testnet or mainnet](#deployment-to-a-testnet-or-mainnet) - [Scripts](#scripts) - [Estimate gas](#estimate-gas) - [Formatting](#formatting) - [Slither](#slither) - [Additional Info:](#additional-info) - [Let's talk about what "Official" means](#lets-talk-about-what-official-means) - [Summary](#summary) - [Thank you!](#thank-you) # Getting Started ## Requirements - [git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) - You'll know you did it right if you can run `git --version` and you see a response like `git version x.x.x` - [foundry](https://getfoundry.sh/) - You'll know you did it right if you can run `forge --version` and you see a response like `forge 0.2.0 (816e00b 2023-03-16T00:05:26.396218Z)` ## Quickstart ``` git clone https://github.com/KMean/cyfrin-updraft-defi-stable-coin.git cd cyfrin-updraft-defi-stable-coin forge build ``` # Usage ## Start a local node ``` make anvil ``` ## Deploy This will default to your local node. You need to have it running in another terminal in order for it to deploy. ``` make deploy ``` ## Deploy - Other Network [See below](#deployment-to-a-testnet-or-mainnet) ## Testing We talk about 4 test tiers in the video. 1. Unit 2. Integration 3. Forked 4. Staging In this repo we cover #1 and Fuzzing. ``` forge test ``` ### Test Coverage ``` forge coverage ``` and for coverage based testing: ``` forge coverage --report debug ``` # Deployment to a testnet or mainnet 1. Setup environment variables You'll want to set your `SEPOLIA_RPC_URL` and `PRIVATE_KEY` as environment variables. You can add them to a `.env` file, similar to what you see in `.env.example`. - `PRIVATE_KEY`: The private key of your account (like from [metamask](https://metamask.io/)). **NOTE:** FOR DEVELOPMENT, PLEASE USE A KEY THAT DOESN'T HAVE ANY REAL FUNDS ASSOCIATED WITH IT. - You can [learn how to export it here](https://metamask.zendesk.com/hc/en-us/articles/360015289632-How-to-Export-an-Account-Private-Key). - `SEPOLIA_RPC_URL`: This is url of the sepolia testnet node you're working with. You can get setup with one for free from [Alchemy](https://alchemy.com/?a=673c802981) Optionally, add your `ETHERSCAN_API_KEY` if you want to verify your contract on [Etherscan](https://etherscan.io/). 1. Get testnet ETH Head over to [faucets.chain.link](https://faucets.chain.link/) and get some testnet ETH. You should see the ETH show up in your metamask. 2. Deploy ``` make deploy ARGS="--network sepolia" ``` ## Scripts Instead of scripts, we can directly use the `cast` command to interact with the contract. For example, on Sepolia: 1. Get some WETH ``` cast send 0xdd13E55209Fd76AfE204dBda4007C227904f0a81 "deposit()" --value 0.1ether --rpc-url $SEPOLIA_RPC_URL --private-key $PRIVATE_KEY ``` 2. Approve the WETH ``` cast send 0xdd13E55209Fd76AfE204dBda4007C227904f0a81 "approve(address,uint256)" 0x091EA0838eBD5b7ddA2F2A641B068d6D59639b98 1000000000000000000 --rpc-url $SEPOLIA_RPC_URL --private-key $PRIVATE_KEY ``` 3. Deposit and Mint DSC ``` cast send 0x091EA0838eBD5b7ddA2F2A641B068d6D59639b98 "depositCollateralAndMintDsc(address,uint256,uint256)" 0xdd13E55209Fd76AfE204dBda4007C227904f0a81 100000000000000000 10000000000000000 --rpc-url $SEPOLIA_RPC_URL --private-key $PRIVATE_KEY ``` ## Estimate gas You can estimate how much gas things cost by running: ``` forge snapshot ``` And you'll see an output file called `.gas-snapshot` # Formatting To run code formatting: ``` forge fmt ```