> For the complete documentation index, see [llms.txt](https://docs.rome.builders/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rome.builders/id/konsep-inti/token-interop.md).

# Interop Token

Rome merepresentasikan token ERC-20 dan token SPL dasarnya sebagai satu akun bersama. Halaman ini menjelaskan bagaimana token bekerja di seluruh EVM dan Solana.

## Model state bersama

Rome tidak mengunci token di satu sisi dan mencetak salinan terbungkus di sisi lain. Sebuah token ERC-20 di Rome adalah sebuah **pembungkus transparan** di atas akun token SPL di Solana — saldo ERC-20 *adalah* saldo SPL.

<figure><img src="/files/4a60e2e2db1044613694a00f4237f9cd273d19c5" alt="An ERC-20 wrapper over the same SPL token account on Solana"><figcaption></figcaption></figure>

* Tidak ada penundaan bridging — saldo ERC-20 adalah saldo SPL
* Tidak ada fragmentasi likuiditas — DeFi di kedua sisi melihat token yang sama
* Tidak ada risiko bridge — tidak ada escrow terpisah yang bisa dieksploitasi

> Path impor di bawah menggunakan `@rome-protocol/rome-solidity`. Publikasi npm masih tertunda; hari ini Anda menggunakan ini dari publik [`rome-solidity`](https://github.com/rome-protocol/rome-solidity) repo (dependensi git atau antarmuka yang disalin). Antarmuka precompile berada di [`contracts/interface.sol`](https://github.com/rome-protocol/rome-solidity/blob/master/contracts/interface.sol).

## Kontrak pembungkus

`SPL_ERC20` (dan varian track cached-nya `SPL_ERC20_cached`, yang saat ini di-deploy oleh factory) menyediakan antarmuka ERC-20 lengkap di atas mint SPL:

* `balanceOf()` — membaca saldo ATA pengguna dari Solana
* `transfer()` — memindahkan token di Solana
* `approve()` / `allowance()` — menggunakan penyimpanan EVM (SPL tidak memiliki allowance bergaya EVM)
* `totalSupply()` — membaca pasokan mint SPL

## Pabrik

`ERC20SPLFactory` mendeploy pembungkus untuk setiap mint SPL:

```solidity
import {ERC20SPLFactory} from "@rome-protocol/rome-solidity/contracts/erc20spl/erc20spl_factory.sol";

// Mendeploy pembungkus, memuat nama/simbol dari metadata Metaplex
address wrapper = factory.add_spl_token_with_metadata(splMint);

// Atau tentukan nama/simbol secara manual
address wrapper = factory.add_spl_token_no_metadata(splMint, "USD Coin", "USDC");
```

Alamat factory aktif: Hadrian `0x86149124d74ebb3aa41a19641b700e88202b6285`, Martius `0xd7aeeedca26cdd4d34eb7c21110af2e590a8c58a`. Selalu verifikasi terhadap [registry](https://github.com/rome-protocol/rome-registry/tree/main/chains) — ini adalah sumber kebenaran untuk alamat yang di-deploy.

## Mint kanonik

Tidak ada kontrak registry token on-chain. Wrapper kanonik dan token gas/bridge dikurasi di [`rome-protocol/registry`](https://github.com/rome-protocol/rome-registry); wrapper tanpa izin yang dibuat melalui `add_spl_token_no_metadata` ditemukan dari event on-chain `TokenCreated` event. Ini menjaga setiap aset dipetakan ke satu mint SPL kanonik tanpa memfragmentasi likuiditas.

## Operasi SPL dari Solidity

Untuk primitive SPL yang ditandatangani user-PDA, gunakan **HelperProgram** precompile (`0xFF…09`) — pembuatan ATA, transfer SPL, dan konversi gas↔lamports:

```solidity
import {IHelperProgram} from "@rome-protocol/rome-solidity/contracts/interface.sol";

IHelperProgram helper = IHelperProgram(0xFF00000000000000000000000000000000000009);

helper.create_ata(user, mint);              // buat ATA pengguna untuk sebuah mint
helper.transfer_spl(to, tokens, mint);      // transfer SPL dari PDA pemanggil
```

`transfer_spl` memiliki beberapa overload (termasuk varian delegate untuk `transferFrom` aliran); lihat `interface.sol` untuk tanda tangan yang tepat. Pada track cached, operasi yang setara berada di `ISplCached` (`0xFF…05`) dan `IAssociatedSplCached` (`0xFF…06`). Sebuah kontrak menggunakan satu track secara konsisten.

## Deposit dan penarikan

* **Ke EVM** — sisi SPL mengkredit ATA milik PDA pengguna; pembungkus ERC-20 segera merefleksikan saldo. Transfer masuk lintas-chain diselesaikan tanpa perlu percaya melalui otorisasi yang ditandatangani pengguna pada bridge.
* **Ke Solana** — panggil `Withdraw` precompile (`0x42…16`): `withdraw_to_pda` / `withdraw_to_ata` memindahkan token dari PDA pengguna kembali ke Solana. Jalur wrap-gas-ke-SPL adalah `withdraw_to_ata`.

## Token gas

Setiap chain memiliki token gas-nya sendiri — sembarang token SPL, diberi harga melalui pool Meteora DAMM (v1 atau v2, dapat dikonfigurasi). Chain publik (Martius, Hadrian) menggunakan USDC. Tidak ada token gas default universal.

## Batasan

* Jumlah token SPL adalah `uint64` (maksimal 18,446,744,073,709,551,615)
* Allowances menggunakan penyimpanan EVM, bukan delegate Solana
* Simbol pembungkus ERC-20 harus unik per factory

## Apa Selanjutnya

* [Alamat Kontrak](/id/referensi/contract-addresses.md) — precompile dan alamat per chain
* [Panggil Solana dari EVM](/id/panduan-pengembang/call-solana-from-evm.md) — CPI dan operasi SPL dari Solidity


---

# 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://docs.rome.builders/id/konsep-inti/token-interop.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.
