ERC777智能合约标准中的send方法和transfer方法最根本的区别

探讨ERC777标准下send与transfer方法的区别,send方法要求接收合约必须实现ERC777TokensRecipient接口,避免代币误锁,强调智能合约安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值