// SPDX-License-Identifier: UNLICENSED pragma solidity =0.8.18; import "@openzeppelin/contracts/security/Pausable.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Multicall.sol"; import "../ISOMA.sol"; import "../SOMAlib.sol"; import "./ISomaContract.sol"; contract SomaContract is ISomaContract, Pausable, ERC165, Multicall { event Initialized(uint8 version); /// @custom:oz-upgrades-unsafe-allow state-variable-immutable ISOMA public immutable override SOMA = SOMAlib.SOMA; /// @custom:oz-upgrades-unsafe-allow constructor constructor() { // matching the openzeppelin reinitializer emit Initialized(1); } modifier onlyMaster() { address sender = _msgSender(); require(SOMA.master() == sender, "SOMA: MASTER"); _; } modifier onlyMasterOrSubMaster() { address sender = _msgSender(); require(SOMA.master() == sender || SOMA.subMaster() == sender, "SOMA: MASTER or SUB MASTER only"); _; } function pause() external virtual override onlyMasterOrSubMaster { _pause(); } function unpause() external virtual override onlyMasterOrSubMaster { _unpause(); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(ISomaContract).interfaceId || super.supportsInterface(interfaceId); } function paused() public view virtual override returns (bool) { return Pausable(address(SOMA)).paused() || super.paused(); } }