transfer转账:接收地址可以是任意的【包含合约地址】
send转账:
1、接收地址如果是合约地址,则必须实现ERC777TokensRecipient接口,否则无法接收!完全可避免转错到合约地址后,无法转出的问题
2、接收地址为普通以太坊地址,和transfer是一样的
send方法和transfer方法最根本的区别:使用时的主要区别send是令牌转移到其他合同可能会显示以下消息:
ERC777: token recipient contract has no implementer for ERC777TokensRecipient
这是一件好事!这意味着接收者合同尚未将自己注册为知道ERC777协议,因此将禁用向其的传输,以防止令牌被永久锁定。举例来说,Golem合约目前持有超过350k的GNT代币,价值数万美元,并且缺乏将它们带出那里的方法。这实际上发生在每个ERC20支持的项目中,通常是由于用户错误。
官方文档:https://docs.openzeppelin.com/contracts/3.x-rc/erc777
关于send方法转账合约的案例介绍:【假如你的合约要接收send方法发送的Token,则必须实现接口IERC777Recipient】
部署以下合约生成合约address后,然后在ERC777的token中送send转账此合约地址,才能转账成功【如果合约没有实现IERC777Recipient 接口是无法使用send方法转账的】
pragma solidity ^0.5.0;
import "../../../node_modules/openzeppelin-solidity/contracts/token/ERC777/IERC777Recipient.sol";
import "../../../node_modules/openzeppelin-solidity//contracts/token/ERC777/IERC777.sol";
import "../../../node_modules/openzeppelin-solidity//contracts/introspection/IERC1820Registry.sol";
contract TestReceivedOwnTokenContract is IERC777Recipient {
/**
* @dev 功能:封装一个测试接收OwnToken的合约地址【来自OwnToken的send方法接收方为合约地址,必须实现IERC777Recipient接口】
*/
mapping(address => uint256) public givers;
address _owner;
IERC777 _token;
// 这些参数请参考ERC777合约的实现,内部已引用!!!
IERC1820Registry private _erc1820 = IERC1820Registry(
0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24
);
// keccak256("ERC777TokensRecipient")
bytes32 private constant TOKENS_RECIPIENT_INTERFACE_HASH = 0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b;
event TokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes userData,
bytes operatorData
);
constructor(IERC777 token) public {
_erc1820.setInterfaceImplementer(
address(this),
TOKENS_RECIPIENT_INTERFACE_HASH,
address(this)
);
_owner = msg.sender;
_token = token;
}
// 【实现IERC1820Registry的接口方法】收款时被回调【当ERC777的Token实现转账时,则会自动调用此方法】
function tokensReceived(
address operator,
address from,
address to,
uint256 amount,
bytes calldata userData,
bytes calldata operatorData
) external {
givers[from] += amount;
emit TokensReceived(operator, from, to, amount, userData, operatorData);
}
}
参考ERC777 功能型Token最佳实践:https://www.jianshu.com/p/5a07f4bee9f9