# Adapter Framework

The Tetrics Adapter Framework provides a flexible, registry-based system for integrating DeFi protocols without enforcing rigid interfaces.

<figure><img src="https://2243833918-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F52yefjiUTNoDeRIGxUMc%2Fuploads%2FdnZGjdHFzDc0dSwdngB4%2Fimage.png?alt=media&#x26;token=b4cf4362-d870-4e76-8af3-cb5b4093e2e8" alt=""><figcaption></figcaption></figure>

### How It Works

#### Protocol Registration

* Each adapter is registered with UniExecutor by protocol name (e.g., "lido", "morpho").
* Executor maintains a mapping: `mapping(string => address) public protocols`.
* Actions specify the protocol name and method to call.

#### BaseAdapter Foundation

* All adapters inherit from `BaseAdapter` (`src/adapters/BaseAdapter.sol`).
* Provides common utilities: token transfers, approvals, balance management.
* No enforced function signatures - adapters define their own interfaces.

#### Protocol-Specific Methods

Each adapter exposes methods specific to its protocol. Examples include:

* **LidoAdapter**:
  * `deposit(uint256 amount)`
* **MorphoAdapter**:
  * `supply(uint256 amount)`
  * `borrow(uint256 amount)`
* **FelixAdapter**:
  * `openCdp(address collateral, uint256 amount)`

#### Dynamic Method Calls

* UniExecutor uses low-level calls to invoke adapter methods.
* Action struct encodes the method signature and parameters.
* Flexibility to support any protocol without interface changes.

#### Adapter Structure

**Example: LidoAdapter**

```solidity
contract LidoAdapter is BaseAdapter {
    address public immutable executor;
    address public immutable stETH;

    constructor(address _executor, address _stETH) {
        executor = _executor;
        stETH = _stETH;
    }

    /// @notice Stake ETH and receive stETH
    function deposit(uint256 amount) external payable returns (uint256) {
        // Protocol-specific implementation
        // ...
    }
}
```
