此函数:
function initializeDomainSeparator() public {
// hash the name context with the contract address
EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(// solium-disable-line
EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
keccak256(bytes(name)),
bytes32(address(this))
^^^^^^^^^^^^^^^^^^^
));
}
正在返回这个错误:
TypeError: Explicit type conversion not allowed from "address" to "bytes32".
我做错了什么?Pragma solid ^0.8.4;
从Solidity 0.8.0开始,你不能再将address
直接转换为bytes32
。您必须执行两个单独的转换:首先到bytes20
,它将类型从address
更改为固定字节,然后到bytes32
扩展长度。
见Solidity v0.8.0 Breaking Changes>新的限制
对显式类型转换有新的限制。只有在符号,宽度或类型类别(
int
,address
,bytesNN
等)最多有一个更改时才允许转换。要执行多个更改,请使用多个转换。
address(uint)
和uint(address)
:转换类型类别和宽度。分别用address(uint160(uint))
和uint(uint160(address))
代替。
所以在你的情况下,正确的转换应该是bytes32(bytes20(address(this)))
。
但是abi.encodePacked()
不要求参数为字节类型,实际上你根本不需要在这里进行转换:
EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(// solium-disable-line
EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
keccak256(bytes(name)),
this
));