1

This function:

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

Is kicking back this error:

TypeError: Explicit type conversion not allowed from "address" to "bytes32".

What am I doing wrong? pragma solidity ^0.8.4;

TNJCoding
  • 45
  • 1
  • 9

1 Answers1

6

Starting with Solidity 0.8.0 you can no longer convert address directly to bytes32. You have to perform two separate conversions: first to bytes20, which changes the type from address to fixed bytes and only then to bytes32 which extends the length.

See Solidity v0.8.0 Breaking Changes > New Restrictions

There are new restrictions on explicit type conversions. The conversion is only allowed when there is at most one change in sign, width or type-category (int, address, bytesNN, etc.). To perform multiple changes, use multiple conversions.

  • address(uint) and uint(address): converting both type-category and width. Replace this by address(uint160(uint)) and uint(uint160(address)) respectively.

So the correct conversion in your case would be bytes32(bytes20(address(this))).

But abi.encodePacked() does not require the argument to be of a bytes type and in fact you do not need a conversion here at all:

EIP712_DOMAIN_HASH = keccak256(abi.encodePacked(// solium-disable-line
    EIP712_DOMAIN_SEPARATOR_SCHEMA_HASH,
    keccak256(bytes(name)),
    this
));
Calypso
  • 192
  • 2
  • 9
cameel
  • 706
  • 2
  • 8
  • Great! If it solved your problem, please remember to mark it as a solution to the question :) – cameel Aug 14 '21 at 16:04