创建新的 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 处理构造函数的顺序。
将子 (MainToken
) 构造函数参数存储到内存中(在您的情况下没有参数)
正在执行父构造函数。
在您的情况下,ERC777("MYTOKEN", "MTK", ops)
的执行失败,因为 storage 变量 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
.
我的理解是,您可以在实例化自定义 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 处理构造函数的顺序。
将子 (
MainToken
) 构造函数参数存储到内存中(在您的情况下没有参数)正在执行父构造函数。
在您的情况下,
ERC777("MYTOKEN", "MTK", ops)
的执行失败,因为 storage 变量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
.