Perhaps this would be the fixed “ConterfactualFactory”:
contract CounterfactualFactory
{
constructor() internal {}
function _create2(bytes memory _code, bytes32 _salt, uint256 _value, bytes memory _initCall)
internal returns(address)
{
bytes memory code = _code;
bytes32 salt = keccak256(abi.encodePacked(_salt, _value, _initCall));
address addr;
// solium-disable-next-line security/no-inline-assembly
assembly
{
addr := create2(_value, add(code, 0x20), mload(code), salt)
if iszero(extcodesize(addr)) { revert(0, 0) }
}
if(_initCall.length > 0){
(bool success, bytes memory reason) = addr.call(_initCall);
require(success, string(reason));
}
return addr;
}
function _predictAddress(bytes memory _code, bytes32 _salt, uint256 _value, bytes memory _initCall)
internal view returns (address)
{
return address(bytes20(keccak256(abi.encodePacked(
bytes1(0xff),
address(this),
keccak256(abi.encodePacked(_salt, _value, _initCall)),
keccak256(_code)
)) << 0x60));
}
}