solidity-erc-standards
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseERC Token Standard Guidelines
ERC代币标准指南
When to Apply
适用场景
- Implementing a new token (Fungible, NFT, Multi-token, or Vault).
- Reviewing existing token implementations for standard compliance.
- Integrating with external tokens (e.g., DeFi protocols, marketplaces).
- Extending standards with custom logic (e.g., Permit, Votes, Enumerable).
- 实现新代币(可替代代币、NFT、多代币或金库代币)
- 审核现有代币实现是否符合标准
- 与外部代币集成(如DeFi协议、交易市场)
- 通过自定义逻辑扩展标准(如Permit、Votes、Enumerable)
ERC20: Fungible Tokens
ERC20:可替代代币
- Required: ,
totalSupply,balanceOf,transfer,allowance,approve.transferFrom - SafeERC20: ALWAYS wrap external ERC20 calls (,
transfer,transferFrom) using OpenZeppelin'sapproveto handle tokens that returnSafeERC20instead of reverting.false - Race Condition: The function has a known race condition. Use
approveandincreaseAllowance(OpenZeppelin) ordecreaseAllowanceto mitigate.ERC20Permit - ERC20Permit (EIP-2612): Use for gasless approvals via signatures (function).
permit - ERC20Votes: Use for governance tokens to enable delegation and checkpointing.
- Common Pitfall: Some tokens (like USDT) do not return a boolean on , causing calls to revert if the interface expects a return value.
transfer
- 必填函数:、
totalSupply、balanceOf、transfer、allowance、approvetransferFrom - SafeERC20:始终使用OpenZeppelin的封装外部ERC20调用(
SafeERC20、transfer、transferFrom),以处理那些返回approve而非回滚的代币false - 竞态条件:函数存在已知的竞态条件。使用OpenZeppelin的
approve和increaseAllowance,或decreaseAllowance来缓解该问题ERC20Permit - ERC20Permit(EIP-2612):用于通过签名实现无Gas费授权(函数)
permit - ERC20Votes:用于治理代币,支持委托和Checkpointing
- 常见陷阱:部分代币(如USDT)的函数不返回布尔值,若接口期望返回值会导致调用回滚
transfer
ERC721: Non-Fungible Tokens
ERC721:非同质化代币(NFT)
- Required: ,
balanceOf,ownerOf,safeTransferFrom,transferFrom,approve,setApprovalForAll,getApproved.isApprovedForAll - safeTransferFrom: Always prefer over
safeTransferFromto ensure the recipient can handle NFTs (viatransferFrom).onERC721Received - ERC721Enumerable: Provides on-chain tracking of all tokens. High gas cost for transfers; avoid unless necessary for on-chain discovery.
- Metadata: Use to link to JSON metadata. Off-chain (IPFS/Arweave) is standard; on-chain (Base64) is used for "fully on-chain" NFTs.
tokenURI - Common Pitfall: Reentrancy via callback during
onERC721Received. UsesafeTransferFromor follow Checks-Effects-Interactions (SCWE-046, SCWE-138).nonReentrant
- 必填函数:、
balanceOf、ownerOf、safeTransferFrom、transferFrom、approve、setApprovalForAll、getApprovedisApprovedForAll - safeTransferFrom:优先使用而非
safeTransferFrom,确保接收方能够处理NFT(通过transferFrom回调)onERC721Received - ERC721Enumerable:提供链上所有代币的追踪功能。转账时Gas成本较高;除非链上发现功能是必需的,否则避免使用
- 元数据:使用链接至JSON元数据。链下存储(IPFS/Arweave)是标准方案;链上存储(Base64)用于"完全链上"NFT
tokenURI - 常见陷阱:过程中通过
safeTransferFrom回调产生的重入问题。使用onERC721Received修饰器或遵循检查-效果-交互模式(SCWE-046、SCWE-138)nonReentrant
ERC1155: Multi-Token
ERC1155:多代币标准
- When to use: When managing multiple token types (fungible and non-fungible) in a single contract. More gas-efficient for batch operations.
- Batch Operations: Use and
safeBatchTransferFromto reduce gas for multiple transfers.balanceOfBatch - URI Pattern: Use a single URI with the substitution string (e.g.,
{id}).https://api.com/{id}.json - Common Pitfall: Forgetting to implement or incorrect implementation of the receiver callback.
balanceOfBatch
- 适用场景:在单个合约中管理多种代币类型(可替代和非同质化代币)时使用。批量操作更节省Gas
- 批量操作:使用和
safeBatchTransferFrom来减少多笔转账的Gas消耗balanceOfBatch - URI模式:使用包含替换字符串的单一URI(如
{id})https://api.com/{id}.json - 常见陷阱:忘记实现或接收方回调实现错误
balanceOfBatch
ERC4626: Tokenized Vault
ERC4626:代币化金库
- Calculations: (assets to shares) and
convertToShares(shares to assets).convertToAssets - Rounding: Favor the vault. Round DOWN on /
deposit(fewer shares for assets) and round UP onmint/withdraw(more shares for assets).redeem - Inflation Attack: First depositor can manipulate share price. Prevent by minting "dead shares" to on the first deposit (SCWE-049).
address(0) - Common Pitfall: Incorrect rounding direction leading to "free" shares or assets over time.
- 核心计算:(资产转换为份额)和
convertToShares(份额转换为资产)convertToAssets - 舍入规则:金库优先。在/
deposit时向下舍入(资产换更少份额),在mint/withdraw时向上舍入(份额换更多资产)redeem - 通胀攻击:首位存款人可操纵份额价格。通过在首次存款时向铸造"死份额"来预防(SCWE-049)
address(0) - 常见陷阱:舍入方向错误导致长期产生"免费"份额或资产
Implementation Choice
实现方案选择
| OpenZeppelin | Solady | |
|---|---|---|
| Gas | Higher | Lower |
| Readability | More readable | More optimized |
| Extensions | Many available | Fewer but efficient |
| When to use | Most projects | Gas-critical applications |
| OpenZeppelin | Solady | |
|---|---|---|
| Gas成本 | 较高 | 较低 |
| 可读性 | 更易读 | 更优化 |
| 扩展功能 | 丰富 | 较少但高效 |
| 适用场景 | 大多数项目 | 对Gas成本敏感的应用 |
Testing Strategies
测试策略
- ERC20: Test (balance changes),
transfer/approve(allowance logic), and edge cases (0 amount,transferFrom).type(uint256).max - ERC721: Test ,
mint,transfer, andapproval(if used). VerifyERC721Enumerabletriggers.onERC721Received - ERC1155: Test batch transfers, URI substitution, and receiver callbacks.
- ERC4626: Test deposit/withdraw symmetry (1:1 if no yield), share calculations, and rounding edge cases.
- ERC20:测试(余额变化)、
transfer/approve(授权逻辑),以及边缘场景(0金额、transferFrom)type(uint256).max - ERC721:测试、转账、授权,以及
mint(若使用)。验证ERC721Enumerable回调是否触发onERC721Received - ERC1155:测试批量转账、URI替换和接收方回调
- ERC4626:测试存款/取款对称性(若无收益则为1:1)、份额计算以及舍入边缘场景
Enhanced with MCP
结合MCP增强功能
When the is available, leverage these tools for ERC implementation:
solidity-agent-toolkitInterface Lookup:
- : Full interface definition, required functions, events, and extension list for ERC20, ERC721, ERC1155, ERC4626
erc://{standard}
Implementation Verification:
- : Verify code against known ERC-specific vulnerabilities
check_vulnerability - : Detect missing SafeERC20, approval race conditions, reentrancy in callbacks
match_vulnerability_patterns - : Look up SCWE entries related to token standards (e.g., "ERC20", "reentrancy")
search_vulnerabilities - : Get fix guidance for specific SCWE IDs found during review
get_remediation
Code Generation:
- Use the prompt for scaffolding compliant token implementations
generate_erc
当可用时,可利用以下工具进行ERC实现:
solidity-agent-toolkit接口查询:
- :获取ERC20、ERC721、ERC1155、ERC4626的完整接口定义、必填函数、事件及扩展列表
erc://{standard}
实现验证:
- :验证代码是否存在已知的ERC特定漏洞
check_vulnerability - :检测是否缺少SafeERC20、授权竞态条件、回调中的重入问题
match_vulnerability_patterns - :查找与代币标准相关的SCWE条目(如"ERC20"、"reentrancy")
search_vulnerabilities - :获取审查中发现的特定SCWE ID的修复指导
get_remediation
代码生成:
- 使用指令生成符合标准的代币实现脚手架
generate_erc
References
参考资料
- ERC Standard Interfaces
- ERC标准接口