注意
**发币违法!!!发币违法!!!发币违法!!!****
仅供学习!!!
一、ERC-20 简介
ERC-20: 在以太坊上构建通用 代币的标准。
官网 https://ethereum.org/zh/developers/docs/standards/tokens/erc-20/
- 如何构建代币:部署一个智能合约
- 合约要遵循令牌标准 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可以调用此函数来执行转账,转账金额不应超过其被授权的额度。
三、发布ERC20 代币-Openzeppelin(推荐)
(一)Openzeppelin简介
内置代币模块,可以与主流区块链平台集成。
被认为是solidity的标准库,内含大量的合约样板!!!
它提供了 ERC20、 ERC721、ERC777、ERC1155 等标准的实现,还提供 Solidity 组件来构建自定义合同和更复杂的分散系统。
OpenZeppelin/Contracts是由OpenZeppelin官网维护的一个开源智能合约库,代码都是经过测试和社区审核过的,相对来说是一个比较安全的智能合约开发库。
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 自动做市商
(二)以太坊范例大全
(三)scaffold-eth
https://github.com/scaffold-eth/scaffold-eth
合约开发脚手架,自动化生成网页 ,便于进行测试,省去了编写测试js的麻烦。
中文介绍https://www.jtqo.com/info/278107.html