@ -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 . . . 0000 AAAAAAAAAAAAAAAAAAA . . . AA |
/ / | 0xFF | FF |
/ / | -- -- -- -- -- -- -- -- -- - | -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - |
/ / | memory | 000000 . . . 00 FFAAAAAAAAAAAAAAAAAAA . . . 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 )
}
}
}