# Transfer Hooks

Transfer Hooks Token-2022 позволяют программе выполнять пользовательскую логику при каждом переводе токенов. Rome позволяет смарт-контрактам Solidity выступать в роли transfer hooks — привнося программируемость EVM в стандарт токенов Solana.

## Как работают Transfer Hooks

Token-2022 (токенная программа Solana следующего поколения) поддерживает расширение под названием Transfer Hook. Когда для mint настроен transfer hook:

1. Каждый `только` вызов для этого mint инициирует назначенную hook-программу
2. Hook получает сведения о переводе (отправитель, получатель, сумма, mint)
3. Hook может одобрить или отклонить перевод
4. Если hook отклоняет (revert), весь перевод завершается неудачей

## Transfer Hooks на базе EVM

В Rome контракт Solidity может выступать в роли обработчика transfer hook:

```
Пользователь обменивает токен на Jupiter (Solana)
    ↓
Jupiter вызывает transfer_checked
    ↓
Token-2022 вызывает назначенную hook-программу
    ↓
Hook-программа = Rome Meta-Hook Router
    ↓
Router направляет вызов в контракт Solidity через CPI → Rome EVM
    ↓
Контракт Solidity выполняет логику соответствия требованиям
    ↓
Успех: перевод завершается
Ошибка: весь перевод откатывается
```

Это означает **каждый SPL-перевод токенов в Solana** — будь то через Jupiter, Raydium, Phantom или любой кошелёк — может запускать логику соответствия требованиям EVM.

## Пример: hook для KYC-верификации

```solidity
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.28;

contract ComplianceHook {
    mapping(address => bool) public kycApproved;
    mapping(address => bool) public sanctioned;

    // Вызывается Meta-Hook Router при каждом переводе
    function onTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bytes32 mint
    ) external view {
        // Проверить, что отправитель прошёл KYC
        require(kycApproved[sender], "Sender not KYC approved");

        // Проверить, что получатель прошёл KYC
        require(kycApproved[recipient], "Recipient not KYC approved");

        // Проверить, что ни одна из сторон не находится под санкциями
        require(!sanctioned[sender], "Sender sanctioned");
        require(!sanctioned[recipient], "Recipient sanctioned");

        // Перевод одобрен — функция завершается без revert
    }
}
```

## Ключевые ограничения

**`только` только.** Hooks срабатывают только на `только` вызовах, а не на обычных `transfer`. Любая интеграция, использующая токены Rome, должна использовать `только` для обеспечения соблюдения требований.

**Требуется односостоянийный режим.** Transfer hooks выполняются внутри транзакций Solana. OP-Geth из этого контекста недоступен. Вся логика EVM-hook должна выполняться в односостоянийном (proxy) режиме.

**Бюджет глубины CPI.** Вызов hook расходует глубину CPI:

```
Уровень 0: DeFi-протокол → SPL Token-2022
Уровень 1: Token-2022 → Meta-Hook Router
Уровень 2: Meta-Hook Router → Rome EVM (CPI precompile)
Уровень 3: Rome EVM → (любой дальнейший CPI из Solidity)
```

После цепочки вызова hook остаётся только один уровень CPI.

**Бюджет вычислений.** EVM-hooks потребляют значительное количество CU:

* Базовые накладные расходы на перевод: 100 000 CU
* На каждый EVM sub-hook: 200 000 CU
* Рекомендуемый бюджет для EVM-перевода: 800 000 CU

## Белый список DeFi-протоколов

Хранилища DeFi-протоколов (Jupiter, Kamino, Orca, bridge vault Rome) требуют особой обработки. Эти хранилища получают и отправляют токены в рамках обычных операций — их блокировка нарушит работу DeFi.

Контракт соответствия поддерживает `protocolWhitelist` mapping. Адреса из белого списка (хранилища, PDA для известных протоколов) одобряются без KYC-проверок. Это позволяет проводить переводы токенов через DeFi-протоколы, при этом сохраняя контроль соответствия требованиям для переводов конечных пользователей.

## Модель адресов

Transfer hooks видят **EVM-адреса, производные от Rome**, а не Ethereum-адреса. Когда пользователь Solana взаимодействует с токеном, подключённым к Rome-hook, его Solana pubkey сопоставляется с EVM-адресом через derivation PDA. Rome Solidity SDK предоставляет утилиты для такого сопоставления.

## Связанные страницы

* [Meta-Hook Router](/ru/produkty/meta-hook-router.md) — мультиплексор hook'ов, позволяющий использовать несколько sub-hook'ов для одного mint
* [Взаимодействие токенов](/ru/osnovnye-koncepcii/token-interop.md) — как связаны токены ERC-20 и SPL
* [Руководство по созданию Transfer Hook](https://github.com/rome-protocol/docs/blob/main/developer-guides/build-transfer-hook.md) — пошаговая разработка hook'а


---

# Agent Instructions: 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:

```
GET https://docs.rome.builders/ru/osnovnye-koncepcii/transfer-hooks.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
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.
