# Transfer Hooks

Token-2022 Transfer Hooks memungkinkan sebuah program mengeksekusi logika kustom pada setiap transfer token. Rome memungkinkan smart contract Solidity bertindak sebagai transfer hook — membawa pemrograman EVM ke standar token Solana.

## Cara Kerja Transfer Hooks

Token-2022 (program token generasi berikutnya milik Solana) mendukung ekstensi yang disebut Transfer Hook. Saat sebuah mint dikonfigurasi dengan transfer hook:

1. Setiap `transfer_checked` panggilan untuk mint tersebut memanggil program hook yang ditentukan
2. Hook menerima detail transfer (pengirim, penerima, jumlah, mint)
3. Hook dapat menyetujui atau menolak transfer
4. Jika hook menolak (revert), seluruh transfer gagal

## Transfer Hooks Bertenaga EVM

Di Rome, sebuah kontrak Solidity dapat berfungsi sebagai penangan transfer hook:

```
Pengguna menukar token di Jupiter (Solana)
    ↓
Jupiter memanggil transfer_checked
    ↓
Token-2022 memanggil program hook yang ditentukan
    ↓
Program hook = Rome Meta-Hook Router
    ↓
Router meneruskan ke kontrak Solidity melalui CPI → Rome EVM
    ↓
Kontrak Solidity mengeksekusi logika kepatuhan
    ↓
Lulus: transfer selesai
Gagal: seluruh transfer revert
```

Ini berarti **setiap transfer token SPL di Solana** — baik di Jupiter, Raydium, Phantom, atau dompet apa pun — dapat memicu logika kepatuhan EVM.

## Contoh: Hook Kepatuhan KYC

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

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

    // Dipanggil oleh Meta-Hook Router pada setiap transfer
    function onTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bytes32 mint
    ) external view {
        // Periksa pengirim sudah KYC
        require(kycApproved[sender], "Pengirim belum disetujui KYC");

        // Periksa penerima sudah KYC
        require(kycApproved[recipient], "Penerima belum disetujui KYC");

        // Periksa tidak ada pihak yang terkena sanksi
        require(!sanctioned[sender], "Pengirim terkena sanksi");
        require(!sanctioned[recipient], "Penerima terkena sanksi");

        // Transfer disetujui — fungsi kembali tanpa revert
    }
}
```

## Batasan Utama

**`transfer_checked` saja.** Hook hanya aktif pada `transfer_checked` panggilan, bukan `transfer`. Setiap integrasi yang menggunakan token Rome harus menggunakan `transfer_checked` untuk memastikan penegakan kepatuhan.

**Mode state tunggal diperlukan.** Transfer hook dieksekusi di dalam transaksi Solana. OP-Geth tidak dapat diakses dari konteks tersebut. Semua logika hook EVM harus berjalan dalam mode state tunggal (proxy).

**Batas kedalaman CPI.** Pemanggilan hook menghabiskan kedalaman CPI:

```
Level 0: Protokol DeFi → SPL Token-2022
Level 1: Token-2022 → Meta-Hook Router
Level 2: Meta-Hook Router → Rome EVM (precompile CPI)
Level 3: Rome EVM → (CPI lanjutan apa pun dari Solidity)
```

Hanya tersisa satu level CPI setelah rantai pemanggilan hook.

**Anggaran komputasi.** Hook EVM mengonsumsi CU yang signifikan:

* Overhead transfer dasar: 100.000 CU
* Per sub-hook EVM: 200.000 CU
* Anggaran yang direkomendasikan untuk transfer EVM: 800.000 CU

## Whitelisting Protokol DeFi

Vault protokol DeFi (Jupiter, Kamino, Orca, vault bridge Rome) memerlukan penanganan khusus. Vault ini menerima dan mengirim token sebagai bagian dari operasi normal — memblokirnya akan merusak DeFi.

Kontrak kepatuhan mempertahankan sebuah `protocolWhitelist` mapping. Alamat yang di-whitelist (vault, PDA untuk protokol yang dikenal) disetujui tanpa pemeriksaan KYC. Ini memungkinkan transfer token melalui protokol DeFi sambil tetap menegakkan kepatuhan pada transfer pengguna akhir.

## Model Alamat

Transfer hook melihat **alamat EVM turunan Rome**, bukan alamat Ethereum. Saat pengguna Solana berinteraksi dengan token yang di-hook Rome, pubkey Solana mereka dipetakan ke alamat EVM melalui derivasi PDA. Rome Solidity SDK menyediakan utilitas untuk pemetaan ini.

## Halaman Terkait

* [Meta-Hook Router](/id/produk/meta-hook-router.md) — multiplexer hook yang memungkinkan beberapa sub-hook per mint
* [Interoperabilitas Token](/id/konsep-inti/token-interop.md) — bagaimana ERC-20 dan token SPL saling berhubungan
* [Panduan Membangun Transfer Hook](https://github.com/rome-protocol/docs/blob/main/developer-guides/build-transfer-hook.md) — pengembangan hook langkah demi langkah


---

# 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/id/konsep-inti/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.
