// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.8.18; import "./interfaces/IModuleCreator.sol"; import "./ModuleSelfAuth.sol"; import "./ModuleERC165.sol"; contract ModuleCreator is IModuleCreator, ModuleERC165, ModuleSelfAuth { event CreatedContract(address _contract); /** * @notice Creates a contract forwarding eth value * @param _code Creation code of the contract * @return addr The address of the created contract */ function createContract(bytes memory _code) public override virtual payable onlySelf returns (address addr) { assembly { addr := create(callvalue(), add(_code, 32), mload(_code)) } if (addr == address(0)) revert CreateFailed(_code); emit CreatedContract(addr); } /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` */ function supportsInterface(bytes4 _interfaceID) public override virtual pure returns (bool) { if (_interfaceID == type(IModuleCreator).interfaceId) { return true; } return super.supportsInterface(_interfaceID); } }