// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Create2Deployer { /** * @dev 使用 CREATE2 部署合约 * @param bytecode 合约的初始化代码(含构造函数参数) * @param salt 用于确定地址的随机数 */ function deploy(bytes memory bytecode, uint256 salt) public returns (address) { address addr; assembly { addr := create2(0, add(bytecode, 0x20), mload(bytecode), salt) if iszero(extcodesize(addr)) { revert(0, 0) } } return addr; } /** * @dev 预先计算合约地址 */ function computeAddress(bytes memory bytecode, uint256 salt) public view returns (address) { bytes32 hash = keccak256( abi.encodePacked( bytes1(0xff), address(this), salt, keccak256(bytecode) ) ); return address(uint160(uint256(hash))); } }