准备将 ERC777 用起来了
一直以来,在以太坊上创建代币都是用的 ERC20 协议,这个协议简单易实现,但确实存在着很多问题:
totalSupply 具体表示什么模糊不清,有的合约用它来表示发行上限,但实际发行量是另外一个数字,有的合约用它来表示实际发行量,总发行量是另外一个数字。上周还有朋友问我为啥把 etherscan 上某个代币转账历史涉及的账户余额加起来和 totalSupply 不一致。
decimals 不统一,增加很多麻烦。因为以太币的最小单位是 wei,一个 以太币有 10 ** 18 wei,decimals 和以太币不一致,就要单独存储和处理。
最要命的,把代币发送到合约上之后,合约无法感知,这可能会导致两种情况: a. 发送到合约的代币永远取不出来了。 b. 用户发送代币到合约后,需要另外一个交易来处理用户的转账。
这些问题,ERC777 都不存在了,并且 ERC777 和 ERC20 完全兼容。OpenZeppelin 也添加了对 ERC777 的支持,代码写起来也不太费事了。下面是基于 OpenZeppelin 的 ERC777 示例代码。
pragma solidity ^0.5.0;
import "openzeppelin-solidity/contracts/token/ERC777/ERC777.sol";
contract GLDToken is ERC777 {
constructor(uint256 initialSupply, address[] memory defaultOperators) ERC777("Gold", "GLD", defaultOperators) public {
_mint(msg.sender, msg.sender, initialSupply, "", "");
}
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!