nnti3n / se-2-challenges

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

🚩 Challenge 2: 🏡 Token Vendor πŸ€–

readme-2

πŸ€– Smart contracts are kind of like "always on" vending machines that anyone can access. Let's make a decentralized, digital currency. Then, let's build an unstoppable vending machine that will buy and sell the currency. We'll learn about the "approve" pattern for ERC20s and how contract to contract interactions work.

🏡 Create YourToken.sol smart contract that inherits the ERC20 token standard from OpenZeppelin. Set your token to _mint() 1000 (* 10 ** 18) tokens to the msg.sender. Then create a Vendor.sol contract that sells your token using a payable buyTokens() function.

πŸŽ› Edit the frontend that invites the user to input an amount of tokens they want to buy. We'll display a preview of the amount of ETH it will cost with a confirm button.

πŸ” It will be important to verify your token's source code in the block explorer after you deploy. Supporters will want to be sure that it has a fixed supply and you can't just mint more.

🌟 The final deliverable is an app that lets users purchase your ERC20 token, transfer it, and sell it back to the vendor. Deploy your contracts on your public chain of choice and then yarn vercel your app to a public web server. Submit the url on SpeedRunEthereum.com!

πŸ’¬ Meet other builders working on this challenge and get help in the Challenge 2 Telegram!


Checkpoint 0: πŸ“¦ Environment πŸ“š

Before you begin, you need to install the following tools:

Then download the challenge to your computer and install dependencies by running:

git clone https://github.com/scaffold-eth/se-2-challenges.git challenge-2-token-vendor
cd challenge-2-token-vendor
git checkout challenge-2-token-vendor
yarn install

in the same terminal, start your local network (a blockchain emulator in your computer):

yarn chain

in a second terminal window, πŸ›° deploy your contract (locally):

cd challenge-2-token-vendor
yarn deploy

in a third terminal window, start your πŸ“± frontend:

cd challenge-2-token-vendor
yarn start

πŸ“± Open http://localhost:3000 to see the app.

πŸ‘©β€πŸ’» Rerun yarn deploy whenever you want to deploy new contracts to the frontend. If you haven't made any contract changes, you can run yarn deploy --reset for a completely fresh deploy.


Checkpoint 1: 🏡Your Token πŸ’΅

πŸ‘©β€πŸ’» Edit YourToken.sol to inherit the ERC20 token standard from OpenZeppelin

Mint 1000 (* 10 ** 18) to your frontend address using the constructor().

(Your frontend address is the address in the top right of http://localhost:3000)

You can yarn deploy --reset to deploy your contract until you get it right.

πŸ₯… Goals

  • Can you check the balanceOf() your frontend address in the Debug Contracts tab? (YourToken contract)
  • Can you transfer() your token to another account and check that account's balanceOf?

debugContractsYourToken

πŸ’¬ Hint: Use an incognito window to create a new address and try sending to that new address. Can use the transfer() function in the Debug Contracts tab.


Checkpoint 2: βš–οΈ Vendor πŸ€–

πŸ‘©β€πŸ’» Edit the Vendor.sol contract with a payable buyTokens() function

Use a price variable named tokensPerEth set to 100:

uint256 public constant tokensPerEth = 100;

πŸ“ The buyTokens() function in Vendor.sol should use msg.value and tokensPerEth to calculate an amount of tokens to yourToken.transfer() to msg.sender.

πŸ“Ÿ Emit event BuyTokens(address buyer, uint256 amountOfETH, uint256 amountOfTokens) when tokens are purchased.

Edit packages/hardhat/deploy/01_deploy_vendor.js to deploy the Vendor (uncomment Vendor deploy lines).

Uncomment the Buy Tokens sections in packages/nextjs/pages/token-vendor.tsx to show the UI to buy tokens on the Token Vendor tab.

πŸ₯… Goals

  • When you try to buy tokens from the vendor, you should get an error: 'ERC20: transfer amount exceeds balance'

⚠️ This is because the Vendor contract doesn't have any YourTokens yet!

βš”οΈ Side Quest: send tokens from your frontend address to the Vendor contract address and then try to buy them.

✏️ We can't hard code the vendor address like we did above when deploying to the network because we won't know the vendor address at the time we create the token contract.

✏️ So instead, edit YourToken.sol to mint the tokens to the msg.sender (deployer) in the constructor().

✏️ Then, edit deploy/01_deploy_vendor.js to transfer 1000 tokens to vendor.address.

await yourToken.transfer(vendor.address, hre.ethers.utils.parseEther("1000"));

πŸ”Ž Look in packages/nextjs/pages/token-vendor.tsx for code to uncomment to display the Vendor ETH and Token balances.

You can yarn deploy --reset to deploy your contract until you get it right.

TokenVendorBuy

πŸ₯… Goals

  • Does the Vendor address start with a balanceOf 1000 in YourToken on the Debug Contracts tab?
  • Can you buy 10 tokens for 0.1 ETH?
  • Can you transfer tokens to a different account?

πŸ“ Edit Vendor.sol to inherit Ownable.

contract Vendor is Ownable {

⚠️ You will also need to import the Ownable.sol contract!

In deploy/01_deploy_vendor.js you will need to call transferOwnership() on the Vendor to make your frontend address the owner:

await vendor.transferOwnership("**YOUR FRONTEND ADDRESS**");

πŸ₯… Goals

  • Is your frontend address the owner of the Vendor?

πŸ“ Finally, add a withdraw() function in Vendor.sol that lets the owner withdraw all the ETH from the vendor contract.

πŸ₯… Goals

  • Can only the owner withdraw the ETH from the Vendor?

βš”οΈ Side Quests

  • What if you minted 2000 and only sent 1000 to the Vendor?

Checkpoint 3: πŸ€” Vendor Buyback 🀯

πŸ‘©β€πŸ« The hardest part of this challenge is to build your Vendor to buy the tokens back.

🧐 The reason why this is hard is the approve() pattern in ERC20s.

πŸ˜• First, the user has to call approve() on the YourToken contract, approving the Vendor contract address to take some amount of tokens.

🀨 Then, the user makes a second transaction to the Vendor contract to sellTokens(uint256 amount).

πŸ€“ The Vendor should call yourToken.transferFrom(msg.sender, address(this), theAmount) and if the user has approved the Vendor correctly, tokens should transfer to the Vendor and ETH should be sent to the user.

πŸ“ Edit Vendor.sol and add a sellTokens(uint256 amount) function!

⚠️ You will need extra UI for calling approve() before calling sellTokens(uint256 amount).

πŸ”¨ Use the Debug Contracts tab to call the approve and sellTokens() at first but then...

πŸ” Look in the packages/nextjs/pages/token-vendor.tsx for the extra approve/sell UI to uncomment!

VendorBuyBack

πŸ₯… Goal

  • Can you sell tokens back to the vendor?
  • Do you receive the right amount of ETH for the tokens?

βš”οΈ Side Quests

  • Should we disable the owner withdraw to keep liquidity in the Vendor?

  • It would be a good idea to display Sell Token Events .Create an event SellTokens(address seller, uint256 amountOfTokens, uint256 amountOfETH) and emit it in your Vendor.sol and uncomment SellTokens Events section in your packages/nextjs/pages/events.tsx to update your frontend.

    Events

⚠️ Test it!

  • Now is a good time to run yarn test to run the automated testing function. It will test that you hit the core checkpoints. You are looking for all green checkmarks and passing tests!

Checkpoint 4: πŸ’Ύ Deploy your contracts! πŸ›°

πŸ“‘ Edit the defaultNetwork to your choice of public EVM networks in packages/hardhat/hardhat.config.ts

πŸ” You will need to generate a deployer address using yarn generate This creates a mnemonic and saves it locally.

πŸ‘©β€πŸš€ Use yarn account to view your deployer account balances.

⛽️ You will need to send ETH to your deployer address with your wallet, or get it from a public faucet of your chosen network.

πŸš€ Run yarn deploy to deploy your smart contract to a public network (selected in hardhat.config.ts)

πŸ’¬ Hint: You can set the defaultNetwork in hardhat.config.ts to sepolia OR you can yarn deploy --network sepolia.

πŸ’¬ Hint: For faster loading of your "Events" page, consider updating the fromBlock passed to useScaffoldEventHistory in packages/nextjs/pages/events.tsx to blocknumber - 10 at which your contract was deployed. Example: fromBlock: 3750241n (where n represents its a BigInt). To find this blocknumber, search your contract's address on Etherscan and find the Contract Creation transaction line.


Checkpoint 5: 🚒 Ship your frontend! 🚁

✏️ Edit your frontend config in packages/nextjs/scaffold.config.ts to change the targetNetwork to chains.sepolia or any other public network.

πŸ’» View your frontend at http://localhost:3000 and verify you see the correct network.

πŸ“‘ When you are ready to ship the frontend app...

πŸ“¦ Run yarn vercel to package up your frontend and deploy.

Follow the steps to deploy to Vercel. Once you log in (email, github, etc), the default options should work. It'll give you a public URL.

If you want to redeploy to the same production URL you can run yarn vercel --prod. If you omit the --prod flag it will deploy it to a preview/test URL.

🦊 Since we have deployed to a public testnet, you will now need to connect using a wallet you own or use a burner wallet. By default πŸ”₯ burner wallets are only available on hardhat . You can enable them on every chain by setting onlyLocalBurnerWallet: false in your frontend config (scaffold.config.ts in packages/nextjs/)

Configuration of Third-Party Services for Production-Grade Apps.

By default, πŸ— Scaffold-ETH 2 provides predefined API keys for popular services such as Alchemy and Etherscan. This allows you to begin developing and testing your applications more easily, avoiding the need to register for these services.
This is great to complete your SpeedRunEthereum.

For production-grade applications, it's recommended to obtain your own API keys (to prevent rate limiting issues). You can configure these at:

  • πŸ”·ALCHEMY_API_KEY variable in packages/hardhat/.env and packages/nextjs/.env.local. You can create API keys from the Alchemy dashboard.

  • πŸ“ƒETHERSCAN_API_KEY variable in packages/hardhat/.env with your generated API key. You can get your key here.

πŸ’¬ Hint: It's recommended to store env's for nextjs in Vercel/system env config for live apps and use .env.local for local testing.


Checkpoint 6: πŸ“œ Contract Verification

Run the yarn verify --network your_network command to verify your contracts on etherscan πŸ›°

πŸ‘€ You may see an address for both YouToken and Vendor. You will want the Vendor address.

πŸ‘‰ Search this address on Etherscan to get the URL you submit to πŸƒβ€β™€οΈSpeedRunEthereum.com.


πŸƒ Head to your next challenge here.

πŸ’¬ Problems, questions, comments on the stack? Post them to the πŸ— scaffold-eth developers chat

About

License:MIT License


Languages

Language:TypeScript 97.0%Language:JavaScript 2.0%Language:Solidity 0.8%Language:CSS 0.2%Language:Shell 0.0%