ERC677 标准是 ERC20 的一个扩展,它继承了 ERC20 的所有方法和事件。
前述:
ERC20 要将代币转移到合约,通常需要三步,比较繁琐。
a. 代币提币,必须要申请合约授权。
b. 告诉合约,代理已获得授权。
c. 运行合约代码,提取代币。
ERC223 运用transfer(address,uint256,bytes)解决了这个问题,但也引入了其它的问题。ERC223通过改变ERC20的tansfer方法,指定转移到未实现onTokenTransfer
的合约,应抛出异常。这是有问题的,即时合约可以安全有效的将代币转给接受者,但是接受者是合约,则会卡在转移中。
ERC667旨在提供ERC223有用的功能,而不会与之冲突。 通过为合约提供在ERC223广泛实施之前实施onTokenTransfer的理由,可以提供平稳的过渡,直到以太坊生态系统的大部分被告知并能够处理ERC223令牌为止。
ERC20内容:
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
ERC677 实现ERC20,并新增了transferAndCall方法,相比transfer新增data字段,在转账同时允许用户携带自定义的数据。
function transferAndCall(address receiver, uint amount, bytes data) returns (bool success)
在方法调用的时候,还会遵循ERC22中设置,触发 Transfer(address,address,uint256,bytes)
事件,记录下发送方、接收方、转账金额以及附带数据。完成转账和记录日志之后,代币合约还会调用接收合约的 onTokenTransfer
方法,用来触发接收合约的逻辑。这就要就接收 ERC677 代币的合约必须实现 onTokenTransfer
方法,用来给代币合约调用。
function onTokenTransfer(address _sender, uint _value, bytes memory _data) virtual public;
参考:https://github.com/ethereum/EIPs/issues/677
https://github.com/ethereum/EIPs/issues/223