Created
February 27, 2019 06:47
Create2Factory.sol
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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