Remix中的显式类型转换



此函数:

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
));

相关内容

  • 没有找到相关文章

最新更新