第七天:ERC-20——发行属于你的第一个代币
语法和测试都齐了,今天开始接触”标准”。ERC-20 是以太坊上 fungible token(同质化代币)的标准接口,USDT、USDC、DAI 全是它。学会 ERC-20,你就读懂了整个 DeFi 的地基。
ERC-20 要求你实现什么
标准很小:一个名称/符号/精度元数据,一个余额表 balanceOf,一个转账 transfer,一套”授权别人代转”的机制 approve/transferFrom,加一个 Transfer/Approval 事件。不要自己从零实现——OpenZeppelin 的实现经过十几年审计打磨,继承它然后写你的业务逻辑:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
contract StudyCoin is ERC20 {
constructor() ERC20("Study Coin", "STC") {
_mint(msg.sender, 1000 * 10 ** decimals());
}
}五行就是一个完整代币。继承构造里写名称和符号,decimals() 默认 18——这是以太坊的约定:1 个代币 = 10^18 个最小单位(类似”分”),前端展示时要除掉。
approve/transferFrom:授权模型为什么这样设计
你可能会问:为什么转账要分两步,先 approve 再 transferFrom?因为很多场景下替你转账的不是人,是合约(交易所、DEX)。用户先授权给 DEX 合约一个额度,之后 DEX 在你的交易里动用这个额度。 approving 时单位是”最小单位”,MetaMask 里常见到天量数字就是这个原因。0.8 之后 OpenZeppelin 提供了 permit(EIP-2612)系列,可以离线签名授权,省一笔 approve 的 gas。
在本地链上跑一遍
forge test # 先保证编译测试通过
anvil # 另开一个终端跑链
# 用 script 部署(明天细讲部署,今天先用 cast 装进 MetaMask 看效果)部署拿到地址后,在 MetaMask 的”导入代币”里粘贴合约地址,你的 STC 余额就出现了。给自己 1000 枚代币的感觉相当奇妙——虽然它目前只活在你本地链上。
今天的作业:给 StudyCoin 加一个 faucet() 函数:任何人每次可领 10 枚、每个地址只能领一次(用第四天的 mapping 思路 + 自定义 error)。明天把它升级成 NFT。
读完了点一下,作者能得积分
赞赏
如果这篇内容帮到了你,不妨请作者喝杯咖啡
赞赏
如果这篇内容帮到了你,不妨请作者喝杯咖啡
选个金额
微信扫码扫一下,金额 ¥6
- 扫码后按所选金额支付即可
- 赞赏完全自愿,与积分、红包互不影响
发表评论