From e2813df879a4e4e74538d3c8bde0b50af8952597 Mon Sep 17 00:00:00 2001 From: Anton Bukov Date: Mon, 9 Mar 2020 19:02:14 +0300 Subject: [PATCH] Use bytes32 explicitly for Create2.computeAddress() (#2088) * Use bytes32 explicitly for Create2.computeAddress(), to force users cache hash of the bytecode * Remove only from test :) --- contracts/mocks/Create2Impl.sol | 10 +++------- contracts/utils/Create2.sol | 14 +++----------- test/utils/Create2.test.js | 14 ++------------ 3 files changed, 8 insertions(+), 30 deletions(-) diff --git a/contracts/mocks/Create2Impl.sol b/contracts/mocks/Create2Impl.sol index 935574898..3b86e2617 100644 --- a/contracts/mocks/Create2Impl.sol +++ b/contracts/mocks/Create2Impl.sol @@ -13,15 +13,11 @@ contract Create2Impl { Create2.deploy(salt, type(ERC20).creationCode); } - function computeAddress(bytes32 salt, bytes memory code) public view returns (address) { - return Create2.computeAddress(salt, code); + function computeAddress(bytes32 salt, bytes32 codeHash) public view returns (address) { + return Create2.computeAddress(salt, codeHash); } - 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) { + function computeAddressWithDeployer(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 8c42cf0de..8db5d0fc5 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -28,19 +28,11 @@ library Create2 { } /** - * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the `bytecode` + * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the `bytecodeHash` * or `salt` will result in a new destination address. */ - function computeAddress(bytes32 salt, bytes memory bytecode) internal view returns (address) { - return computeAddress(salt, bytecode, address(this)); - } - - /** - * @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 bytecode, address deployer) internal pure returns (address) { - return computeAddress(salt, keccak256(bytecode), deployer); + function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { + return computeAddress(salt, bytecodeHash, address(this)); } /** diff --git a/test/utils/Create2.test.js b/test/utils/Create2.test.js index 61beeb534..69c3c0f46 100644 --- a/test/utils/Create2.test.js +++ b/test/utils/Create2.test.js @@ -22,7 +22,7 @@ describe('Create2', function () { it('should compute the correct contract address', async function () { const onChainComputed = await this.factory - .computeAddress(saltHex, constructorByteCode); + .computeAddress(saltHex, web3.utils.keccak256(constructorByteCode)); const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, this.factory.address); expect(onChainComputed).to.equal(offChainComputed); @@ -30,17 +30,7 @@ describe('Create2', function () { it('should compute the correct contract address with deployer', async function () { const onChainComputed = await this.factory - .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 - ); + .computeAddressWithDeployer(saltHex, web3.utils.keccak256(constructorByteCode), deployerAccount); const offChainComputed = computeCreate2Address(saltHex, constructorByteCode, deployerAccount); expect(onChainComputed).to.equal(offChainComputed);