Implement an efficient lookup mechanism for a real-time fraud detection cache. Store fraud decisions by key, return only unexpired entries, and evict the least recently used entry when capacity is exceeded. Implement fraud_cache_lookup(capacity, operations), where each operation is a dictionary: {"op": "put", "key": str, "value": str, "expires_at": int} or {"op": "get", "key": str, "at": int}. Return a list containing each GET result, using None for a miss or expired entry. Both GET and PUT operations should run in O(1) average time.
def fraud_cache_lookup(capacity, operations):