|
@@ -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,27 @@ 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 {
|
|
|
+ let ptr := mload(0x40) // Get free memory pointer
|
|
|
+
|
|
|
+ // | | ↓ 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)
|
|
|
+ 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)
|
|
|
+ }
|
|
|
}
|
|
|
}
|