pragma ever-solidity >= 0.68.0; import "../../libraries/UtilityErrors.tsol"; import "../../libraries/MsgFlag.tsol"; import "../../reservation/abstract/Reservable.tsol"; import "../../reservation/abstract/TargetBalance.tsol"; import "../../validation/abstract/Validatable.tsol"; import "../interfaces/IActivatable.tsol"; /// @title Activatable /// @notice Implements base functions for activatable contract /// @dev A contract is abstract - to be sure that it will be inherited by another contract abstract contract Activatable is IActivatable, Reservable, Validatable, TargetBalance { /// @dev Whether or not a contract is active bool private _isActive; function _getTargetBalanceInternal() internal virtual override view returns (uint128); /// @dev Function can be called only if the contract is active modifier onlyActive() { require(_isActive, UtilityErrors.CONTRACT_IS_NOT_ACTIVE); _; } function getActiveStatus() external view override responsible returns (bool) { return { value: 0, flag: MsgFlag.REMAINING_GAS, bounce: false } _isActive; } function setActiveStatus( bool _newActiveStatus, optional(address) _remainingGasTo ) external virtual override reserveAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) validAddressOrNull(_remainingGasTo, UtilityErrors.INVALID_GAS_RECIPIENT) { _setActiveStatusInternal(_newActiveStatus); } /// @dev Internal call to set new active status /// @dev Emits ActiveStatusChanged event after update /// @param _newActiveStatus New active status of the contract function _setActiveStatusInternal(bool _newActiveStatus) internal { bool previous = _isActive; _isActive = _newActiveStatus; // Emit event about change emit ActiveStatusChanged( _newActiveStatus, previous ); } /// @dev Use it inside onCodeUpgrade to set active status without ActiveStatusChanged event /// @param _newActiveStatus New active status of the contract function _setActiveStatusSilent(bool _newActiveStatus) internal { _isActive = _newActiveStatus; } /// @dev Internal call to get current active status /// @dev Useful for contract upgrading to remember active status /// @return bool Current active status of the contract function _getActiveStatusInternal() internal view returns (bool) { return _isActive; } }