W3
EIP-1155ERC代币标准Final(2018-06-17)

多代币标准

一个合约同时管理多种代币:同质化与非同质化可以共存,支持批量转移,游戏道具场景的首选。

适用链:全部 EVM 链 + 各 L2

为什么重要:ERC-1155 把「同一批道具的 1000 份」表示为同一个 id 的余额,而不是 1000 个 NFT。这使得批量空投、批量转移的 Gas 从 O(n) 降到接近 O(1),是链游与票务的标准做法。

函数签名与选择器

选择器是签名的 keccak256 前 4 字节;事件则是完整的 32 字节 topic0。 点一下即可复制。

签名 / 字段选择器 / topic0说明
balanceOf(address,uint256)某地址持有某个 id 的数量。
balanceOfBatch(address[],uint256[])批量查询,两个数组长度必须相等。
setApprovalForAll(address,bool)授权操作者管理全部代币种类。
isApprovedForAll(address,address)查询全局授权。
safeTransferFrom(address,address,uint256,uint256,bytes)from / to / id / amount / data 五个参数。
safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)批量转移:ids 与 amounts 数组一一对应,这是它相对 721 最大的优势。
event URI(string,uint256)事件id 的元数据地址变更时发出。
event TransferSingle(address,address,address,uint256,uint256)事件单笔转移事件,operator 是实际执行者。
event TransferBatch(address,address,address,uint256[],uint256[])事件批量转移事件,索引器需要按数组展开处理。

代码模板

最小实现(单笔 + 批量转移)
最小实现(单笔 + 批量转移)Solidity

批量转移时 receiver 回调只调一次(onERC1155BatchReceived),而不是每个 id 调一次,这是省 Gas 的关键。

批量空投的调用方式(viem)
批量空投的调用方式(viem)TypeScript

实现与使用时的常见陷阱

  • ids 与 amounts 数组长度必须一致,否则必须 revert——漏掉这个检查会让索引器算错余额。
  • 是否用 ERC-1155 的判断依据:同一批资产需要发多份(道具、票、材料)。如果每份都独一无二且需要独立元数据,用 ERC-721。
  • 部分市场对 ERC-1155 的支持弱于 721,做 PFP 类项目不建议用它。
  • uri 里的 {id} 是十六进制、64 位补齐的字符串(OpenZeppelin 的惯例),自己实现时要确认前端替换逻辑一致。
  • 批量转移的 receiver 回调必须返回正确的 selector,否则整批回滚。

相关标准

同属「代币标准」的其他标准
想把这个标准用起来?开发者路径的第 1–2 阶段讲了怎么把它写进项目;合约 IDE里有对应的可编辑模板与静态自检;链上 API 参考则给出前端调用它的三种写法。