diff --git a/contracts/mocks/Create2Impl.sol b/contracts/mocks/Create2Impl.sol index 5a67b3110eb..93557489835 100644 --- a/contracts/mocks/Create2Impl.sol +++ b/contracts/mocks/Create2Impl.sol @@ -20,4 +20,8 @@ contract Create2Impl { function computeAddress(bytes32 salt, bytes memory code, address deployer) public pure returns (address) { return Create2.computeAddress(salt, code, deployer); } + + function computeAddress(bytes32 salt, bytes32 codeHash, address deployer) public pure returns (address) { + return Create2.computeAddress(salt, codeHash, deployer); + } } diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 4361fddf51a..8c42cf0de0a 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -39,10 +39,17 @@ library Create2 { * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ - function computeAddress(bytes32 salt, bytes memory bytecodeHash, address deployer) internal pure returns (address) { - bytes32 bytecodeHashHash = keccak256(bytecodeHash); + function computeAddress(bytes32 salt, bytes memory bytecode, address deployer) internal pure returns (address) { + return computeAddress(salt, keccak256(bytecode), deployer); + } + + /** + * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at + * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. + */ + function computeAddress(bytes32 salt, bytes32 bytecodeHash, address deployer) internal pure returns (address) { bytes32 _data = keccak256( - abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHashHash) + abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash) ); return address(bytes20(_data << 96)); } diff --git a/test/utils/Create2.test.js b/test/utils/Create2.test.js index 5df38557309..61beeb53408 100644 --- a/test/utils/Create2.test.js +++ b/test/utils/Create2.test.js @@ -30,7 +30,17 @@ describe('Create2', function () { it('should compute the correct contract address with deployer', async function () { const onChainComputed = await this.factory - .computeAddress(saltHex, constructorByteCode, deployerAccount); + .methods['computeAddress(bytes32,bytes,address)'](saltHex, constructorByteCode, deployerAccount); + const offChainComputed = + computeCreate2Address(saltHex, constructorByteCode, deployerAccount); + expect(onChainComputed).to.equal(offChainComputed); + }); + + it('should compute the correct contract address with deployer and bytecode hash', async function () { + const onChainComputed = await this.factory + .methods['computeAddress(bytes32,bytes32,address)']( + saltHex, web3.utils.keccak256(constructorByteCode), deployerAccount + ); const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, deployerAccount); expect(onChainComputed).to.equal(offChainComputed);