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

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

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的ERC20智能合约示例: ```solidity pragma solidity ^0.8.0; contract ERC20Token { string public name; string public symbol; uint256 public totalSupply; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; constructor(string memory _name, string memory _symbol, uint256 _totalSupply) { name = _name; symbol = _symbol; totalSupply = _totalSupply; balanceOf[msg.sender] = _totalSupply; } function transfer(address _to, uint256 _value) public returns (bool success) { require(balanceOf[msg.sender] >= _value, "Insufficient balance"); balanceOf[msg.sender] -= _value; balanceOf[_to] += _value; emit Transfer(msg.sender, _to, _value); return true; } function approve(address _spender, uint256 _value) public returns (bool success) { allowance[msg.sender][_spender] = _value; emit Approval(msg.sender, _spender, _value); return true; } function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) { require(balanceOf[_from] >= _value, "Insufficient balance"); require(allowance[_from][msg.sender] >= _value, "Insufficient allowance"); balanceOf[_from] -= _value; balanceOf[_to] += _value; allowance[_from][msg.sender] -= _value; emit Transfer(_from, _to, _value); return true; } event Transfer(address indexed _from, address indexed _to, uint256 _value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } ``` 该合约包括以下功能: - `name`:代币名称 - `symbol`:代币符号 - `totalSupply`:代币总量 - `balanceOf`:每个地址的代币余额 - `allowance`:允许其他地址花费的代币数量 该合约实现了ERC20标准的以下函数: - `transfer`:从调用者的地址向另一个地址发送代币 - `approve`:允许另一个地址花费指定数量的代币 - `transferFrom`:从一个地址向另一个地址发送代币,前提是已经获得了允许 该合约还定义了两个事件: - `Transfer`:代币发送时触发 - `Approval`:允许花费代币时触发 要部署这个合约,你需要使用Solidity编译器将其编译为字节码,然后将字节码发送到以太坊网络上。你可以使用Remix或Truffle等工具来编译和部署智能合约

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值