From 71741071ee6c6aea0b6a381a9507a61a7726d54a Mon Sep 17 00:00:00 2001 From: sparklingGibbon <87142001+ToweringTopaz@users.noreply.github.com> Date: Thu, 4 Aug 2022 22:09:08 -0500 Subject: [PATCH 01/13] optimize Create2.computeAddress --- contracts/utils/Create2.sol | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index b1e4ee15c7b..91f3dfef3b4 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -31,8 +31,7 @@ library Create2 { uint256 amount, bytes32 salt, bytes memory bytecode - ) internal returns (address) { - address addr; + ) internal returns (address addr) { require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); /// @solidity memory-safe-assembly @@ -40,7 +39,6 @@ library Create2 { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } require(addr != address(0), "Create2: Failed on deploy"); - return addr; } /** @@ -59,8 +57,16 @@ library Create2 { bytes32 salt, bytes32 bytecodeHash, address deployer - ) internal pure returns (address) { - bytes32 _data = keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash)); - return address(uint160(uint256(_data))); + ) internal pure returns (address addr) { + /// @solidity memory-safe-assembly + assembly { + mstore(0, deployer) + mstore8(0x0b, 0xff) + mstore(0x20, salt) + let ptr := mload(0x40) + mstore(0x40, bytecodeHash) + addr := keccak256(11,85) + mstore(0x40, ptr) + } } } From 0dbba542ee75e8191a155539ebf21e616638bd07 Mon Sep 17 00:00:00 2001 From: sparklingGibbon <87142001+ToweringTopaz@users.noreply.github.com> Date: Thu, 4 Aug 2022 22:39:41 -0500 Subject: [PATCH 02/13] prettier --- contracts/utils/Create2.sol | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 91f3dfef3b4..22612b50ae0 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -63,9 +63,9 @@ library Create2 { mstore(0, deployer) mstore8(0x0b, 0xff) mstore(0x20, salt) - let ptr := mload(0x40) + let ptr := mload(0x40) mstore(0x40, bytecodeHash) - addr := keccak256(11,85) + addr := keccak256(11, 85) mstore(0x40, ptr) } } From c54ecd111dae043ad185baa58b4f78362cea75da Mon Sep 17 00:00:00 2001 From: ToweringTopaz <87142001+ToweringTopaz@users.noreply.github.com> Date: Fri, 5 Aug 2022 00:06:26 -0500 Subject: [PATCH 03/13] Use hex memory addresses consistently --- contracts/utils/Create2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 22612b50ae0..f451e6239e1 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -65,7 +65,7 @@ library Create2 { mstore(0x20, salt) let ptr := mload(0x40) mstore(0x40, bytecodeHash) - addr := keccak256(11, 85) + addr := keccak256(0x0b, 85) mstore(0x40, ptr) } } From f71c4d229f6d70a441e60ee9dbdc41b900fb27f2 Mon Sep 17 00:00:00 2001 From: ToweringTopaz <87142001+ToweringTopaz@users.noreply.github.com> Date: Fri, 5 Aug 2022 00:11:17 -0500 Subject: [PATCH 04/13] Use hex memory addresses consistently --- contracts/utils/Create2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index f451e6239e1..5d61a891733 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -60,7 +60,7 @@ library Create2 { ) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { - mstore(0, deployer) + mstore(0x00, deployer) mstore8(0x0b, 0xff) mstore(0x20, salt) let ptr := mload(0x40) From bc0421dc2679e32ee3082fce5fc096107f87ba27 Mon Sep 17 00:00:00 2001 From: ToweringTopaz <87142001+ToweringTopaz@users.noreply.github.com> Date: Sat, 6 Aug 2022 01:06:47 -0500 Subject: [PATCH 05/13] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1afa0ddf822..9a04190fd29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,7 @@ * `ReentrancyGuard`: Reduce code size impact of the modifier by using internal functions. ([#3515](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3515)) * `SafeCast`: optimize downcasting of signed integers. ([#3565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3565)) * `ERC20FlashMint`: add an internal `_flashFee` function for overriding. ([#3551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3551)) + * * `Create2`: optimize address computation by using assembly instead of `abi.encodePacked`. ([#3600](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3600)) ### Compatibility Note From e2a4bc2f73ef62998f1f920ca761624dbe31289b Mon Sep 17 00:00:00 2001 From: ToweringTopaz <87142001+ToweringTopaz@users.noreply.github.com> Date: Sat, 6 Aug 2022 01:07:02 -0500 Subject: [PATCH 06/13] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9a04190fd29..7a38732e4eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ * `ReentrancyGuard`: Reduce code size impact of the modifier by using internal functions. ([#3515](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3515)) * `SafeCast`: optimize downcasting of signed integers. ([#3565](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3565)) * `ERC20FlashMint`: add an internal `_flashFee` function for overriding. ([#3551](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3551)) - * * `Create2`: optimize address computation by using assembly instead of `abi.encodePacked`. ([#3600](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3600)) + * `Create2`: optimize address computation by using assembly instead of `abi.encodePacked`. ([#3600](https://github.com/OpenZeppelin/openzeppelin-contracts/pull/3600)) ### Compatibility Note From 1137c7f75edc4adef450e6552e1ff2e5019f0fb4 Mon Sep 17 00:00:00 2001 From: ToweringTopaz <87142001+ToweringTopaz@users.noreply.github.com> Date: Wed, 10 Aug 2022 10:37:23 -0500 Subject: [PATCH 07/13] Update contracts/utils/Create2.sol Co-authored-by: Hadrien Croubois --- contracts/utils/Create2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 5d61a891733..bb8c6a0d6e2 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -60,10 +60,10 @@ library Create2 { ) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { + let ptr := mload(0x40) mstore(0x00, deployer) mstore8(0x0b, 0xff) mstore(0x20, salt) - let ptr := mload(0x40) mstore(0x40, bytecodeHash) addr := keccak256(0x0b, 85) mstore(0x40, ptr) From 306af2f71ba141ea07bc63787c59a3fd4933fff7 Mon Sep 17 00:00:00 2001 From: sparklingGibbon <87142001+ToweringTopaz@users.noreply.github.com> Date: Sun, 21 Aug 2022 20:56:40 -0500 Subject: [PATCH 08/13] use free memory per @frangio --- contracts/utils/Create2.sol | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index bb8c6a0d6e2..2a0a82032b3 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -60,13 +60,14 @@ library Create2 { ) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { - let ptr := mload(0x40) - mstore(0x00, deployer) - mstore8(0x0b, 0xff) - mstore(0x20, salt) - mstore(0x40, bytecodeHash) - addr := keccak256(0x0b, 85) - mstore(0x40, ptr) + let ptr := mload(0x40) //get free memory pointer + mstore(add(ptr,0x40), bytecodeHash) + mstore(add(ptr,0x20), salt) + + mstore(ptr, deployer) //right-aligned with 12 preceding garbage bytes + ptr := add(ptr,0x0b) //The hashed data starts at the final garbage byte which we will overwrite with 0xff + mstore8(ptr, 0xff) + addr := keccak256(ptr, 85) } } } From 0ad221676340809f21cefe52a30bb675abad9b5c Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 23 Aug 2022 00:00:59 -0300 Subject: [PATCH 09/13] fix whitespace and use new variable --- contracts/utils/Create2.sol | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 2a0a82032b3..735d167c35f 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -60,14 +60,14 @@ library Create2 { ) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { - let ptr := mload(0x40) //get free memory pointer - mstore(add(ptr,0x40), bytecodeHash) - mstore(add(ptr,0x20), salt) + let ptr := mload(0x40) // Get free memory pointer + mstore(add(ptr, 0x40), bytecodeHash) + mstore(add(ptr, 0x20), salt) - mstore(ptr, deployer) //right-aligned with 12 preceding garbage bytes - ptr := add(ptr,0x0b) //The hashed data starts at the final garbage byte which we will overwrite with 0xff - mstore8(ptr, 0xff) - addr := keccak256(ptr, 85) + mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes + let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff + mstore8(start, 0xff) + addr := keccak256(start, 85) } } } From 777aa57f2c946947de88c78b60a17256767ce8b5 Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 23 Aug 2022 00:21:53 -0300 Subject: [PATCH 10/13] lint --- contracts/utils/Create2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 735d167c35f..3de883867ce 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -66,7 +66,7 @@ library Create2 { mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff - mstore8(start, 0xff) + mstore8(start, 0xff) addr := keccak256(start, 85) } } From 501ab13f0cec4468fcad341b2bed11bf366630b8 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 23 Aug 2022 11:13:49 +0200 Subject: [PATCH 11/13] Update Create2.sol --- contracts/utils/Create2.sol | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 3de883867ce..3a1a1f06b0a 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -61,9 +61,19 @@ library Create2 { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) // Get free memory pointer + + // | | ↓ ptr ↓ ptr + 0x0B (start) ↓ ptr + 0x20 ↓ ptr + 0x40 | + // |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + // | bytecodeHash | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | + // | salt | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | + // | deployer | 000000000000000000000000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | + // | 0xFF | FF | + // |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| + // | memory | 0000000000000000000000FFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | + // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | + mstore(add(ptr, 0x40), bytecodeHash) mstore(add(ptr, 0x20), salt) - mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff mstore8(start, 0xff) From ab1b89cb10d2752a4a26ba6e8c1045c6c32df4a9 Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Tue, 23 Aug 2022 11:19:01 +0200 Subject: [PATCH 12/13] lint --- contracts/utils/Create2.sol | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 3a1a1f06b0a..53b6d8955b1 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -61,7 +61,7 @@ library Create2 { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) // Get free memory pointer - + // | | ↓ ptr ↓ ptr + 0x0B (start) ↓ ptr + 0x20 ↓ ptr + 0x40 | // |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| // | bytecodeHash | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | From 152eca8f4d3c21d11a61ede9f3b735c199c62438 Mon Sep 17 00:00:00 2001 From: Francisco Date: Tue, 23 Aug 2022 17:21:32 -0300 Subject: [PATCH 13/13] adjust diagram width --- contracts/utils/Create2.sol | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/contracts/utils/Create2.sol b/contracts/utils/Create2.sol index 53b6d8955b1..80acc3e2ff5 100644 --- a/contracts/utils/Create2.sol +++ b/contracts/utils/Create2.sol @@ -62,15 +62,15 @@ library Create2 { assembly { let ptr := mload(0x40) // Get free memory pointer - // | | ↓ ptr ↓ ptr + 0x0B (start) ↓ ptr + 0x20 ↓ ptr + 0x40 | - // |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - // | bytecodeHash | CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | - // | salt | BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB | - // | deployer | 000000000000000000000000AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA | - // | 0xFF | FF | - // |-------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| - // | memory | 0000000000000000000000FFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC | - // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | + // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... | + // |-------------------|---------------------------------------------------------------------------| + // | bytecodeHash | CCCCCCCCCCCCC...CC | + // | salt | BBBBBBBBBBBBB...BB | + // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA | + // | 0xFF | FF | + // |-------------------|---------------------------------------------------------------------------| + // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC | + // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | mstore(add(ptr, 0x40), bytecodeHash) mstore(add(ptr, 0x20), salt)