// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; contract ComplianceRegistry is Ownable { address public operator; mapping(address wallet => uint64 expiresAt) public approvalExpiry; error NotOperator(); error InvalidOperator(); error InvalidExpiry(); event OperatorUpdated(address indexed operator); event ApprovalUpdated(address indexed wallet, uint64 expiresAt); constructor(address initialOwner, address initialOperator) Ownable(initialOwner) { _setOperator(initialOperator); } modifier onlyOperator() { if (msg.sender != operator) revert NotOperator(); _; } function setOperator(address newOperator) external onlyOwner { _setOperator(newOperator); } function setApproval(address wallet, uint64 expiresAt) external onlyOperator { if (wallet == address(0)) revert InvalidOperator(); if (expiresAt != 0 && expiresAt <= block.timestamp) revert InvalidExpiry(); approvalExpiry[wallet] = expiresAt; emit ApprovalUpdated(wallet, expiresAt); } function isApproved(address wallet) external view returns (bool) { return approvalExpiry[wallet] > block.timestamp; } function _setOperator(address newOperator) private { if (newOperator == address(0)) revert InvalidOperator(); operator = newOperator; emit OperatorUpdated(newOperator); } }