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 :)
pull/2124/head
Anton Bukov 5 years ago committed by GitHub
parent ca19cea05e
commit e2813df879
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 10
      contracts/mocks/Create2Impl.sol
  2. 14
      contracts/utils/Create2.sol
  3. 14
      test/utils/Create2.test.js

@ -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);
}
}

@ -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));
}
/**

@ -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);

Loading…
Cancel
Save