> For the complete documentation index, see [llms.txt](https://gabriel-j-shapiro.gitbook.io/metalex-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://gabriel-j-shapiro.gitbook.io/metalex-docs/protocol-reference/hooks.md).

# Hooks

The protocol uses two kinds of hook: **transfer-restriction hooks** consulted on token transfers, and a **Uniswap v4 hook** used by LiquiLeX pools.

## Transfer-restriction hooks

### `ITransferRestrictionHook`

```solidity
interface ITransferRestrictionHook {
    function checkTransferRestriction(
        address from,
        address to,
        uint256 tokenId,   // token id for cyberCERTs; amount for cyberSCRIP
        bytes memory data
    ) external view returns (bool allowed, string memory reason);
}
```

Both `CyberCertPrinter` and `CyberScrip` consult these hooks on transfer:

* `CyberScrip` holds an **array** of hooks (`setRestrictionHook`); every hook must allow the transfer or it reverts `RestrictedTransfer(reason)`.
* `CyberCertPrinter` holds per-id hooks (`setRestrictionHook(id, hook)`) and a `globalRestrictionHook` (`setGlobalRestrictionHook`).

### Implementations

In [`src/hooks/transfer/`](https://github.com/MetaLex-Tech/cybercorps-contracts/tree/develop/src/hooks/transfer):

| Hook                    | Purpose                                                        |
| ----------------------- | -------------------------------------------------------------- |
| `BaseTransferHook`      | Common base for transfer-restriction hooks.                    |
| `WhitelistTransferHook` | Allows transfers only between whitelisted addresses.           |
| `ToggleTransferHook`    | Per-token transfer on/off switch, with a configurable default. |

> These three implement `ITransferRestrictionHook`. Consult each contract's source for its admin functions (whitelist management, toggle setters).

## Uniswap v4 hook

### `MetalexIssuerFeeHook`

In [`src/hooks/uniswap/`](https://github.com/MetaLex-Tech/cybercorps-contracts/tree/develop/src/hooks/uniswap). A Uniswap v4 hook for **LiquiLeX** AMM pools that splits swap fees between MetaLeX and the issuer, so a cyberSCRIP / stablecoin pool pays the issuer onchain on every trade. See the source for its exact configuration and the hook-address requirements Uniswap v4 imposes.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://gabriel-j-shapiro.gitbook.io/metalex-docs/protocol-reference/hooks.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
