pragma ever-solidity >= 0.68.0; pragma AbiHeader time; pragma AbiHeader expire; pragma AbiHeader pubkey; import "locklift/src/console.tsol"; import "../../../contracts/access/abstract/Ownable.tsol"; import "../../../contracts/libraries/UtilityErrors.tsol"; import "../../../contracts/libraries/UtilityGas.tsol"; contract OwnableExample is Ownable { uint32 private static _nonce; function _getTargetBalanceInternal() internal view override returns (uint128) { return UtilityGas.INITIAL_BALANCE; } constructor( optional(address) _initialOwner, optional(address) _remainingGasTo ) public reserveAcceptAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) validAddressOrNull(_initialOwner, UtilityErrors.INVALID_NEW_OWNER) validAddressOrNull(_remainingGasTo, UtilityErrors.INVALID_GAS_RECIPIENT) { address initialOwner = _initialOwner.hasValue() ? _initialOwner.get() : msg.sender; _setOwnerInternal(initialOwner); } function check(optional(address) _remainingGasTo) external view reserveAndRefund(_getTargetBalanceInternal(), _remainingGasTo, msg.sender) onlyOwner { console.log(format("Caller is owner: {}", _nonce)); } }