> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Model akun

> Arsitektur Solana yang berpusat pada akun — akun menyimpan status, program adalah kode stateless yang beroperasi pada akun. Rent, kepemilikan, akun program vs akun data, dan apa artinya ketika Anda membaca status pool Raydium.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/solana-fundamentals/account-model)
</Info>

Model akun Solana adalah hal yang paling penting dipahami sebelum membaca kode Raydium. Tidak seperti Ethereum di mana status hidup bersama kode kontrak, program Solana sepenuhnya stateless: semua status hidup di "akun" terpisah yang program operasikan. Setiap pool, posisi, dan vault Raydium adalah akun — memahami cara kerja akun tersebut membuat dokumentasi lainnya menjadi masuk akal.

## Pemisahan fundamental: program vs akun

### Program

Sebuah **program** di Solana adalah kode yang dapat dieksekusi — biner yang dikompilasi, dimuat dari file, dikerahkan ke `Pubkey`, dan dapat dipanggil melalui transaksi. Program tidak memiliki status yang terkait; mereka hanya berisi logika.

Program Raydium:

* CPMM: `CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F`
* CLMM: `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK`
* AMM v4: `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8`

Masing-masing adalah biner tetap. Program tidak "mengingat" apa pun antar pemanggilan.

### Akun

Sebuah **akun** adalah baris data dalam jaringan. Setiap akun memiliki:

* `pubkey` — alamatnya.
* `owner` — program yang memilikinya (mengontrol penulisan).
* `data` — byte mentah.
* `lamports` — saldo SOL (1 SOL = 1.000.000.000 lamports).
* `rent_epoch` — field pengumpulan rent warisan (diabaikan sejak bebas-rent menjadi wajib).

Ketika Anda mengkueri pool Raydium, Anda membaca satu atau lebih akun. Ketika swap berjalan, program CPMM membaca/menulis beberapa akun — status pool, vault, status observasi, dan akun token pengguna.

## Kepemilikan

Setiap akun dimiliki oleh tepat satu program. Hanya kode program tersebut yang dapat mengubah field `data` akun. Pengguna dapat mengubah `lamports` (mengirim/menerima SOL) pada akun yang mereka bisa tandatangani, tetapi memodifikasi `data` memerlukan program pemilik untuk melakukannya atas nama mereka.

Contoh:

* Dompet pengguna Anda: dimiliki oleh Sistem Program. Lamports hidup di sini; Anda menandatangani untuk mentransfer.
* Akun token USDC Anda: dimiliki oleh Program SPL Token. Instruksi program token `transfer` memperbarui saldo.
* Akun status pool Raydium: dimiliki oleh program CPMM. Hanya instruksi CPMM yang dapat memodifikasi cadangan, biaya, dll.
* `PersonalPositionState` NFT posisi Raydium: dimiliki oleh program CLMM.

"Dimiliki oleh" bersifat ketat: jika program A menulis ke akun yang dimiliki oleh program B, runtime Solana menolak transaksi.

## Rent dan bebas-rent

Membuat akun mengonsumsi ruang penyimpanan. Solana mengenakan biaya rent untuk ruang tersebut, tetapi sejak 2020 semua akun baru harus **bebas-rent** — artinya mereka memiliki lamports cukup sehingga rent yang mereka hutang selama 2 tahun dibayar sebelumnya. Secara praktis:

* Akun bebas-rent hidup selamanya.
* Menutup akun mengembalikan lamports kepada penandatangan penutup.

Untuk akun 165-byte (mis. akun SPL Token), bebas-rent adalah \~0,00204 SOL. Untuk status pool CPMM Raydium 1.440-byte, itu \~0,011 SOL.

### Biaya rent Raydium

| Akun                       | Ukuran    | Rent        |
| -------------------------- | --------- | ----------- |
| CPMM PoolState             | \~1.440 B | \~0,011 SOL |
| CLMM PoolState             | \~1.500 B | \~0,012 SOL |
| CLMM TickArray             | \~9.000 B | \~0,063 SOL |
| CLMM PersonalPositionState | \~280 B   | \~0,003 SOL |
| ATA                        | 165 B     | \~0,002 SOL |
| Vault (Token Account)      | 165 B     | \~0,002 SOL |

Pembuatan pool memerlukan rent untuk beberapa akun sekaligus — itulah mengapa pembuatan pool CPMM menelan biaya \~0,15 SOL total.

## Akun data vs executable

Akun datang dalam dua varian:

### Akun data

Menyimpan status (cadangan pool, saldo token, posisi pengguna). `executable = false`. Ini adalah mayoritas besar.

### Akun executable

Menyimpan bytecode program. `executable = true`. Ini adalah program (CPMM, CLMM, dll.). Program tidak memiliki data selain bytecode mereka.

### Akun yang diturunkan program (PDA)

PDA adalah akun data yang alamatnya *diturunkan secara deterministik* dari program dan beberapa seed — tidak ada kunci privat yang ada untuk alamat ini. Hanya program penurunan yang dapat menandatangani atas nama PDA melalui `invoke_signed`.

Raydium menggunakan PDA secara ekstensif:

* PDA status pool: diturunkan dari `[poolTypeDiscriminator, mintA, mintB, ammConfig]`.
* PDA vault: diturunkan dari `[pool, mint]`.
* PDA status observasi: diturunkan dari `[observationSeed, pool]`.

PDA memungkinkan Raydium membuat akun pada alamat yang dapat diprediksi tanpa mengelola kunci. Siapa pun dapat menghitung alamat PDA untuk pool yang diketahui dengan seed yang diberikan.

Lihat [`solana-fundamentals/pdas-and-cpis`](/id/solana-fundamentals/pdas-and-cpis).

## Transaksi dan referensi akun

Setiap transaksi Solana membawa daftar eksplisit akun yang akan dibaca/ditulis. Runtime menegakkan:

* Akun yang tercantum dapat dibaca atau ditulis (menurut flag `is_writable` mereka).
* Akun yang tidak tercantum tidak dapat disentuh.

Untuk swap Raydium, daftar akun transaksi mencakup:

```
[readonly] Program CPMM
[writable] status pool
[readonly] konfigurasi amm
[readonly] otoritas pool (PDA)
[writable] vault input
[writable] vault output
[writable] ATA input pengguna
[writable] ATA output pengguna
[readonly] mint input
[readonly] mint output
[readonly] program token input
[readonly] program token output
[writable] status observasi
[signer,writable] pengguna
```

Enumerasi eksplisit ini adalah alasan transaksi Solana cepat dan dapat diparlelekan — runtime dapat menentukan txs tanpa konflik sebelumnya.

## Ukuran akun dan tata letak data

Setiap akun Raydium memiliki ukuran tetap atau terbatas. Tata letak didefinisikan dalam kode (struct Rust dengan `#[repr(C)]`) dan didokumentasikan di [`sdk-api/anchor-idl`](/id/sdk-api/anchor-idl).

Program Anchor menambahkan **diskriminator** 8-byte ke setiap akun yang mereka buat, yang diturunkan dari `hash("account:<StructName>")[0..8]`. Ini memungkinkan klien mengidentifikasi jenis akun hanya dengan membaca 8 byte pertama — penting untuk pemindaian `getProgramAccounts` yang menghitung semua akun jenis tertentu.

### Membaca status pool Raydium

Melalui SDK:

```ts theme={null}
const pool = await raydium.cpmm.getPoolInfoFromRpc({ poolId });
console.log(pool.poolInfo);
```

Melalui RPC mentah + tata letak:

```ts theme={null}
const accountInfo = await connection.getAccountInfo(poolId);
const data = accountInfo.data;
// Lewati 8 byte pertama (diskriminator), kemudian parse menurut tata letak struct.
const poolState = CpmmPoolStateLayout.decode(data.slice(8));
```

Tata letaknya ada di `src/raydium/cpmm/layout.ts` di sumber SDK.

## Contoh terselesaikan: membaca akun token

Mari kita baca saldo USDC pengguna.

```ts theme={null}
import { Connection, PublicKey } from "@solana/web3.js";
import { getAssociatedTokenAddressSync, AccountLayout } from "@solana/spl-token";

const connection = new Connection("https://api.mainnet-beta.solana.com");
const user       = new PublicKey("YourUserWallet...");
const usdcMint   = new PublicKey("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v");

// 1. Hitung alamat ATA (derivasi gaya PDA).
const ata = getAssociatedTokenAddressSync(usdcMint, user);

// 2. Baca akun.
const accountInfo = await connection.getAccountInfo(ata);
if (!accountInfo) {
  console.log("ATA belum ada (pengguna belum pernah memegang USDC).");
  return;
}

// 3. Verifikasi pemilik adalah program SPL Token.
console.assert(accountInfo.owner.toBase58() === "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA");

// 4. Dekode data.
const parsed = AccountLayout.decode(accountInfo.data);
console.log("Saldo (unit terkecil):", parsed.amount.toString());
console.log("Mint:",                     new PublicKey(parsed.mint).toBase58());
console.log("Pemilik:",                    new PublicKey(parsed.owner).toBase58());
```

Pola ini — turunkan alamat, ambil akun, verifikasi pemilik, dekode — berlaku untuk setiap pembacaan dalam jaringan, termasuk pool Raydium.

## Mengapa ini penting untuk Raydium

Model akun membentuk desain Raydium:

* **Status pool adalah akun tunggal** — segalanya tentang pool (mint, cadangan, biaya, admin) hidup dalam satu akun yang dimiliki oleh program pool.
* **Token LP adalah akun token SPL standar** — Raydium mendelegasikan tokenisasi ke program SPL Token.
* **Array tick dipotong-potong** — CLMM tidak dapat memiliki larik tick yang dapat tumbuh tunggal karena akun memiliki ukuran dialokasikan tetap; sebagai gantinya, ia menggunakan `TickArray` PDA yang dipotong.
* **Posisi NFT adalah NFT Metaplex** — posisi CLMM adalah NFT standar per Metaplex; status posisi adalah PDA terpisah.

Memahami ini memungkinkan Anda menjawab pertanyaan "di mana X hidup?" dengan benar:

* "Di mana cadangan pool?" → dua akun vault (akun token) yang dimiliki oleh program SPL Token, dengan otoritas didelegasikan ke PDA program pool.
* "Di mana data tick untuk CLMM?" → serangkaian PDA TickArray, masing-masing mencakup 60 tick berturut-turut.
* "Di mana stake farm saya?" → PDA `UserLedger` yang diturunkan dari `[user, farmId]`, dimiliki oleh program farm.

## Penunjuk

* [`solana-fundamentals/programs-and-anchor`](/id/solana-fundamentals/programs-and-anchor) — cara program memproses akun.
* [`solana-fundamentals/pdas-and-cpis`](/id/solana-fundamentals/pdas-and-cpis) — derivasi PDA dan CPI.
* [`solana-fundamentals/transactions-and-fees`](/id/solana-fundamentals/transactions-and-fees) — cara akun dirujuk dalam transaksi.
* [`sdk-api/anchor-idl`](/id/sdk-api/anchor-idl) — tata letak akun untuk program Raydium.

Sumber:

* [Dokumen Akun Solana](https://docs.solana.com/developing/programming-model/accounts).
* [Program SPL Token](https://spl.solana.com/token) — di mana akun token hidup.
