创建新的 ERC-777 时如何定义运算符?

How do you define operator when creating new ERC-777?

我的理解是,您可以在实例化自定义 ERC-777 时定义一个运算符,它可以使用 operatorSend 函数进行转账,而无需由发件人批准。但是,似乎无法获取将令牌部署到继承的构造函数中的合约地址。我尝试将地址推入构造函数主体中的数组,但这似乎没有用。

contract MainToken is ERC777 {
    address[] ops=;
  constructor ()  ERC777("MYTOKEN", "MTK",ops) {
      ops.push(msg.sender);
    }
...
}

如果我尝试像这样 ERC777("MYTOKEN", "MTK",[msg.sender]) 那样直接将它放入构造函数中,我会得到

Invalid type for argument in modifier invocation. Invalid implicit conversion from address[1] memory to address[] memory requested.

Solidity 目前不允许在一个表达式中定义动态大小的数组。 注意:您的示例中的 [msg.sender] 是固定大小的数组定义。

此外,您定义 ops 属性 的方法不起作用,因为 EVM 处理构造函数的顺序。

  1. 将子 (MainToken) 构造函数参数存储到内存中(在您的情况下没有参数)

  2. 正在执行父构造函数。

    在您的情况下,ERC777("MYTOKEN", "MTK", ops) 的执行失败,因为 storage 变量 ops 尚不可用。

  3. 正在执行子构造函数(在你的情况下ops.push(msg.sender);


所以我能想到的最简单的解决方案是从 MyToken 参数传递地址。如果您可以控制部署过程并且可以在部署合同时手动传递 msg.sender 的值,这将很有用。

pragma solidity 0.8.4;

import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC777/ERC777.sol';

contract MyToken is ERC777 {

    constructor(address[] memory defaultOperators)
        ERC777('MYTOKEN', 'MTK', defaultOperators) {
    }

}

如果您不打算控制部署并需要在构造函数中分配 msg.sender,我建议在本地复制 ERC777 合约并修改其构造函数,以便它只添加msg.sender.