区块链全栈以太坊(十一)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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,463评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,868评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,213评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,666评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,759评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,725评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,716评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,484评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,928评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,233评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,393评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,073评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,718评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,308评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,538评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,338评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,260评论 2 352

推荐阅读更多精彩内容