Browse Source

Rename CREATE2 argument from bytecodeHash to bytecode and add new method for precomputed bytecode hash (#2087)

* Rename CREATE2 argument from bytecodeHash to bytecode and add new method for precomputed bytecode hash

* Remove only from test

* Fix linter error
Anton Bukov 5 years ago
parent
commit
19417c7cd5
3 changed files with 25 additions and 4 deletions
  1. 4 0
      contracts/mocks/Create2Impl.sol
  2. 10 3
      contracts/utils/Create2.sol
  3. 11 1
      test/utils/Create2.test.js

+ 4 - 0
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);
+    }
 }

+ 10 - 3
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));
     }

+ 11 - 1
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);