// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; import "@openzeppelin/contracts/access/Ownable.sol"; import "./interfaces/IAdapterRegistry.sol"; /** * @title AdapterRegistry * @notice Manages whitelist/blacklist of protocol adapters */ contract AdapterRegistry is IAdapterRegistry, Ownable { mapping(address => AdapterInfo) public adapters; mapping(address => bool) public whitelist; mapping(address => bool) public blacklist; event AdapterRegistered(address indexed adapter, string name, AdapterType adapterType); event AdapterWhitelisted(address indexed adapter, bool whitelisted); event AdapterBlacklisted(address indexed adapter, bool blacklisted); /** * @notice Register a new adapter */ function registerAdapter( address adapter, string calldata name, AdapterType adapterType ) external onlyOwner { require(adapters[adapter].registeredAt == 0, "Adapter already registered"); adapters[adapter] = AdapterInfo({ name: name, adapterType: adapterType, registeredAt: block.timestamp, whitelisted: false }); emit AdapterRegistered(adapter, name, adapterType); } /** * @notice Whitelist an adapter */ function setWhitelist(address adapter, bool _whitelisted) external onlyOwner { require(adapters[adapter].registeredAt > 0, "Adapter not registered"); adapters[adapter].whitelisted = _whitelisted; whitelist[adapter] = _whitelisted; emit AdapterWhitelisted(adapter, _whitelisted); } /** * @notice Blacklist an adapter */ function setBlacklist(address adapter, bool _blacklisted) external onlyOwner { blacklist[adapter] = _blacklisted; if (_blacklisted) { adapters[adapter].whitelisted = false; whitelist[adapter] = false; } emit AdapterBlacklisted(adapter, _blacklisted); } /** * @notice Check if adapter is whitelisted */ function isWhitelisted(address adapter) external view override returns (bool) { return !blacklist[adapter] && adapters[adapter].whitelisted; } /** * @notice Get adapter info */ function getAdapter(address adapter) external view returns (AdapterInfo memory) { return adapters[adapter]; } }