Skip to content

Instantly share code, notes, and snippets.

@cwhinfrey
Created February 27, 2019 06:47
Create2Factory.sol
pragma solidity ^0.5.2;
contract Create2FactoryBase {
bytes private contractCode;
constructor(bytes memory _contractCode) public {
contractCode = _contractCode;
}
function _createContract(bytes32 _salt) internal returns (address _contract) {
bytes memory _contractCode = contractCode;
assembly {
_contract := create2(0, add(_contractCode, 0x20), mload(_contractCode), _salt)
if iszero(extcodesize(_contract)) {revert(0, 0)}
}
}
function _computeContractAddress(bytes32 _salt) internal view returns (address _contractAddress) {
bytes32 contractCodeHash = keccak256(contractCode);
bytes32 _data = keccak256(
abi.encodePacked(
bytes1(0xff),
address(this),
_salt,
contractCodeHash
)
);
_contractAddress = address(bytes20(_data << 96));
}
}
contract Create2Factory is Create2FactoryBase {
function deployContract(
bytes32 _salt,
bytes memory _initData
)
public
returns (address _contractAddress)
{
bytes32 actualSalt = keccak256(abi.encodePacked(_salt, _initData));
_contractAddress = _createContract(actualSalt);
if (_initData.length == 0) {
(bool success,) = _contractAddress.call(_initData);
require(success);
}
}
function computeContractAddress(bytes32 _salt, address _initData) public view returns (address _contractAddress) {
bytes32 actualSalt = keccak256(abi.encodePacked(_salt, _initData));
return _computeContractAddress(actualSalt);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment