Langsung ke konten utama

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.

Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
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

AkunUkuranRent
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
ATA165 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.

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. 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:
const pool = await raydium.cpmm.getPoolInfoFromRpc({ poolId });
console.log(pool.poolInfo);
Melalui RPC mentah + tata letak:
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.
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

Sumber: