all files / contracts/utils/ Deployer.sol

100% Statements 10/10
100% Branches 4/4
100% Functions 3/3
100% Lines 11/11
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58                                                              46× 46× 45× 45× 68×   39×                     73×     73× 66× 66×      
// SPDX-License-Identifier: GPL-3.0-or-later
// code borrowed from EIP-2470
// https://etherscan.io/address/0xce0042B868300000d44A59004Da54A005ffdcf9f#code
pragma solidity 0.8.6;
 
import "./../interfaces/utils/IDeployer.sol";
 
 
/**
 * @title Deployer
 * @notice Exposes `CREATE2` (EIP-1014) to deploy bytecode on deterministic addresses based on initialization code and salt.
 * @author solace.fi
 */
contract Deployer is IDeployer {
 
    /**
     * @notice Deploys `initcode` using `salt` for defining the deterministic address.
     * @param initcode Initialization code.
     * @param salt Arbitrary value to modify resulting address.
     * @return createdContract Created contract address.
     */
    function deploy(bytes memory initcode, bytes32 salt) external override returns (address payable createdContract) {
        return _deploy(initcode, salt);
    }
 
    /**
     * @notice Deploys `initcodes` using `salts` for defining the deterministic address.
     * @param initcodes Initialization codes.
     * @param salts Arbitrary values to modify resulting addresses.
     * @return createdContracts Created contract addresses.
     */
    function deployMultiple(bytes[] memory initcodes, bytes32[] memory salts) external override returns (address payable[] memory createdContracts) {
        uint256 length = initcodes.length;
        require(length == salts.length, "length mismatch");
        createdContracts = new address payable[](length);
        for(uint256 i = 0; i < length; i++) {
            createdContracts[i] = _deploy(initcodes[i], salts[i]);
        }
        return createdContracts;
    }
 
    /**
     * @notice Deploys `initcode` using `salt` for defining the deterministic address.
     * @param initcode Initialization code.
     * @param salt Arbitrary value to modify resulting address.
     * @return createdContract Created contract address.
     */
    function _deploy(bytes memory initcode, bytes32 salt) internal returns (address payable createdContract) {
        // solhint-disable-next-line no-inline-assembly
        assembly {
            createdContract := create2(0, add(initcode, 0x20), mload(initcode), salt)
        }
        require(createdContract != address(0x0), "invalid initcode");
        emit ContractDeployed(createdContract);
        return createdContract;
    }
}