区块链全栈以太坊(十一)Defi、ERC20

注意

**发币违法!!!发币违法!!!发币违法!!!****

仅供学习!!!

一、ERC-20 简介

ERC-20: 在以太坊上构建通用 代币的标准。
官网 https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/

  1. 如何构建代币:部署一个智能合约
  2. 合约要遵循令牌标准 https://eips.ethereum.org/EIPS/eip-20
    实现令牌标准规定的这些函数等。

·获得代币总供应量
·获得账户余额
·转让代币
·批准花费代币

二、发布ERC20 代币-手工源码

源码 https://github.com/PatrickAlphaC/hardhat-erc20-fcc

(一)快速开始

git clone https://github.com/PatrickAlphaC/hardhat-erc20-fcc
cd hardhat-erc20-fcc
yarn

(二)源码分析

ManualToken.sol

这个合约实现了 ERC20 的合约协议,解释其中几个函数:

allowance,approve 和 transferFrom,这几个函数提供了一些高级功能,用于授权其他以太坊地址的所有者(spender)代表你使用你的token。这个“其他以太坊地址”可能是一个智能合约,也可能只是一个普通token账户。
● approve函数。Token所有者可以调用这个函数授权spender代表它使用value数量的token。
● allowance 函数。此函数被用来查看owner给spender的token额度
● transferFrom函数。spender可以调用此函数来执行转账,转账金额不应超过其被授权的额度。

应用场景 Uniswap

三、发布ERC20 代币-Openzeppelin(推荐)

(一)Openzeppelin简介

内置代币模块,可以与主流区块链平台集成。

被认为是solidity的标准库,内含大量的合约样板!!!

它提供了 ERC20、 ERC721、ERC777、ERC1155 等标准的实现,还提供 Solidity 组件来构建自定义合同和更复杂的分散系统。
OpenZeppelin/Contracts是由OpenZeppelin官网维护的一个开源智能合约库,代码都是经过测试和社区审核过的,相对来说是一个比较安全的智能合约开发库。

nodejs管理,通过npm下载到本地使用,可以配合trufflehardhat脚手架使用

npm install @openzeppelin/contracts

https://zhuanlan.zhihu.com/p/622734913
https://www.qklw.com/blockchain/20230618/310640.html

Solmate类似Openzeppelin,目标也是成为 solidity的标准库。

(二)OurToken.sol

官方文档https://docs.openzeppelin.com/contracts/5.x/erc20

直接继承官方的 ERC20合约即可,传入 币种名称 、币种代号,
部署合约OurToken即可完成代币发布。

import "@openzeppelin/contracts/token/ERC20/ERC20.sol";

contract OurToken is ERC20 {
// initial supply is 50 <- 50 WEI// initial supply 50e18
//50* 10**18
  constructor(uint256 initialSupply) ERC20("OurToken", "OT") {
    _mint(msg.sender, initialSupply);
  }
}

四、DeFi实战 - AAVE

去中心化借贷,是智能合约的最佳用例之一

金融机构,他们做生意是为了赚钱不是为了保住我们的钱

(一)项目简介

去中心化金融(DeFi)项目,使用户能够在没有中介的情况下借出和借用加密货币。
主网地址:https://app.aave.com/
测试环境:主网---》 右上角设置---》打开测试模式。
等同于测试环境 https://staging.aave.com/

源码

https://github.com/PatrickAlphaC/hardhat-defi-fcc

目的

演示用js 与 aave的合约交互,完成aave 官方网页上做的事情,体验合约之间的交互。

(二)WETH快速学习

对eth进行 ERC20 的 包装后的合约币,便于各个DApp在以太坊上进行多币种的交互操作。
WETH 由来:https://blog.csdn.net/feeltouch/article/details/125304875

1)ETH 转 WETH

1.etherscan-contact- write contract -> deposit 直接 质押eth。

2.把合约地址 复制到 metaMask -> 添加代币->粘贴,即可看到WETH 余额。

注意
现在 sepolia.etherscan 没有 tokens 这个搜索项,不能直接根据WETH 搜索 合约, 所以没法这么操作。
但是
sepolia网上应该还是存在一个合约(Weth9)用来 ETH 转 WETH的,
因为,aave 测试模式,领取水龙头,质押ETH代币后,可以把当前WETH余额导入metaMask(sepolia)。
那么显然,是有在sepolia上进行了ETH 币 对换 WETH币的操作。

2)WETH 转 ETH

1.etherscan-contact- write contract -> withdraw 把WETH转成eth 提到钱包。

2.把合约地址 复制到 metaMask -> 添加代币->粘贴,即可看到WETH 余额。

3)weth contract源码

https://www.jianshu.com/p/00b488fe0309

(三)js调用

源码hardhat-defi-fcc
实际使用中,肯定不会去 etherscan 调用合约,
这里模拟实战,用js调用。

1)ETH 转 WETH

getWeth.js文件里的getWeth()实现。

其实就是调用 deposit 往合约转入 eth。

注意,这里js调用合约只依赖了合约的接口(IWETH.sol ,类似 ERC20)。

async function getWeth() {
    const { deployer } = await getNamedAccounts()
    const iWeth = await ethers.getContractAt(
        "IWeth",
        //到 etherscan找出 weth address
        networkConfig[network.config.chainId].wethToken,
        deployer
    )
    const txResponse = await iWeth.deposit({
        value: AMOUNT,
    })
    await txResponse.wait(1)
    const wethBalance = await iWeth.balanceOf(deployer)
    console.log(`Got ${wethBalance.toString()} WETH`)
}

2)WETH 质押

aaveBorrow.js文件里

const lendingPool = await getLendingPool(deployer)
//到 etherscan找出 weth address
const wethTokenAddress = networkConfig[network.config.chainId].wethToken
//批准  aave 合约使用 我的多少 weth
await approveErc20(wethTokenAddress, lendingPool.address, AMOUNT, deployer)
console.log("Depositing WETH...")
// aave的合约 拿走我的amount weth 作为质押
await lendingPool.deposit(wethTokenAddress, AMOUNT, deployer, 0)

3)借出DAI币

aaveBorrow.js文件里

 //查看 可借ETH,欠的ETH
let { availableBorrowsETH, totalDebtETH } = await getBorrowUserData(lendingPool, deployer)
const daiPrice = await getDaiPrice()
// 按* 0.95 算出能借出多少 eth
const amountDaiToBorrow = availableBorrowsETH.toString() * 0.95 * (1 / daiPrice.toNumber())
//转换单位
const amountDaiToBorrowWei = ethers.utils.parseEther(amountDaiToBorrow.toString())
console.log(`You can borrow ${amountDaiToBorrow.toString()} DAI`)
//借出 DAI
//到 etherscan找出 daiToken address
await borrowDai(
    networkConfig[network.config.chainId].daiToken,
    lendingPool,
    amountDaiToBorrowWei,
    deployer
)
//查看 可借ETH,欠的ETH
await getBorrowUserData(lendingPool, deployer)

4)偿还DAI币

(四)分叉主网

一种测试智能合约的方法。
把主网上的数据复制到本地节点,进行开发测试的方法。

分叉区块链 不会影响主网
因为是模拟区块链,它只在我们当地环境中运行,供本地开发测交互。

不把整个区块链下载到本地,而是连到一个alchemy mainnet节点。
到 alchemy dashboard 新建app

比mock更方便。

forking也会给我们一堆假账户、以太坊。

Hardhat官方文档https://hardhat.org/hardhat-network/docs/guides/forking-other-networks

 networks: {
        hardhat: {
            chainId: 31337,
            forking: {
                url: MAINNET_RPC_URL,
            },
        },
 }

TODO

(一)DeFi实战 -uniswap

去中心化交易所

uniswap协议已经成为贸易的天堂

AMM 自动做市商

(二)以太坊范例大全

https://speedrunethereum.com/

(三)scaffold-eth

https://github.com/scaffold-eth/scaffold-eth

合约开发脚手架,自动化生成网页 ,便于进行测试,省去了编写测试js的麻烦。
中文介绍https://www.jtqo.com/info/278107.html

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容