我的理解是,您可以在实例化自定义ERC-777时定义一个运算符,该运算符可以进行传输,而无需使用operatorSend函数得到发件人的批准。但是,似乎无法获得将令牌部署到继承构造函数中的契约地址。我试着将地址推入构造函数体中的数组中,但似乎没有。
contract MainToken is ERC777 {
address[] ops=;
constructor () ERC777("MYTOKEN", "MTK",ops) {
ops.push(msg.sender);
}
...
}如果我尝试将它直接放入构造函数中,如so ERC777("MYTOKEN", "MTK",[msg.sender]),我将得到
修饰符调用中参数的
无效类型。请求从address1内存到address[]内存的无效隐式转换。
发布于 2021-05-02 16:52:01
Solidity目前不允许在一个表达式中定义动态大小的数组。注意:示例中的[msg.sender]是一个固定大小的数组定义。
另外,定义ops属性的方法无法工作,这是因为EVM处理构造函数的顺序。
MainToken)构造器参数存储到内存(在本例中为无参数)执行父构造函数的
在您的示例中,ERC777("MYTOKEN", "MTK", ops)的执行失败,因为存储变量ops还不可用。
执行子构造函数的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。
https://stackoverflow.com/questions/67356893
复制相似问题