Dokumentasi SolanaLiteSVMRustPeti Tambahanlitesvm-token

Mulai Cepat

Instalasi

Pastikan Anda memiliki semua dependensi yang diperlukan:

cargo add --dev litesvm litesvm-token solana-sdk spl-token spl-associated-token-account

Dasar-Dasar Token SPL

Di Solana, membuat token account adalah proses dua langkah.

Buat Mint Account

  • Tidak memiliki saldo token
  • Menyimpan semua informasi global token, seperti total pasokan, desimal, otoritas, dll.
  • Terdapat satu mint account per token
  • Pemiliknya adalah Token Program (TokenKeg atau Token 2022)

Buat Token Account

  • Menyimpan saldo untuk token SPL tertentu
  • Menyimpan mint account untuk menentukan token SPL mana yang ada di akun ini
  • Dapat ada beberapa token account untuk satu mint account
  • Pemilik adalah pihak yang memiliki kendali atas token di dalam akun ini

Jenis-Jenis Token Account

Token Account Reguler

Sebuah token account menyimpan saldo Anda untuk token SPL tertentu:

// Can create token accounts at ANY address
let token_account = Keypair::new(); // Random address
let create_ix = system_instruction::create_account(
&payer.pubkey(),
&token_account.pubkey(), // Any address you want
rent,
165, // Token account size
&spl_token::id(),
);
let init_ix = spl_token::instruction::initialize_account(
&spl_token::id(),
&token_account.pubkey(),
&mint,
&owner.pubkey(),
)?;

Kelebihan

  • Dapat membuat beberapa akun untuk mint/pemilik yang sama
  • Fleksibel - dapat menggunakan alamat apa pun

Kekurangan

  • Tidak deterministik - perlu melacak alamat secara manual
  • Penerima harus memberi tahu akun mana yang akan dituju
  • Menimbulkan kebingungan dengan banyak akun

Kapan digunakan: Akun sementara/escrow, akun milik program dengan logika kustom, saat Anda membutuhkan beberapa akun untuk token yang sama, strategi DeFi tingkat lanjut.

Associated Token Account (ATA)

ATA adalah token account pada alamat PDA yang deterministik:

// ATA address is ALWAYS the same for owner + mint
let ata = get_associated_token_address(&owner.pubkey(), &mint);
// Address derived from: [owner_pubkey, token_program_id, mint]

Cara alamat ATA diturunkan:

// ATA is a PDA owned by the Associated Token Program
let (ata, bump) = Pubkey::find_program_address(
&[
owner.as_ref(),
spl_token::id().as_ref(),
mint.as_ref(),
],
&spl_associated_token_account::id(), // ATA program
);

Kelebihan

  • Satu akun kanonik per pasangan pemilik/mint
  • Deterministik - siapa pun dapat menghitung alamatnya
  • Menyederhanakan pembayaran - cukup butuh alamat dompet + mint
  • Konvensi standar di semua aplikasi Solana

Kekurangan

  • Hanya dapat memiliki SATU ATA per pasangan pemilik/mint (sesuai desain)

Direkomendasikan untuk sebagian besar kasus: Aplikasi dompet, protokol DeFi, kepemilikan NFT, sistem pembayaran, dan transfer token yang berhadapan langsung dengan pengguna.

Contoh Cepat

Berikut adalah contoh lengkap pembuatan token mint dan pencetakan token:

use litesvm::LiteSVM;
use litesvm_token::{
get_spl_account,
spl_token::{native_mint::DECIMALS, state::Account as TokenAccount},
CreateAccount, CreateMint, MintTo, Transfer,
};
use solana_sdk::{
native_token::LAMPORTS_PER_SOL,
signature::{Keypair, Signer},
};
#[test]
fn test_create_and_mint_tokens() {
let mut svm = LiteSVM::new();
// Create payer account and fund it
let payer = Keypair::new();
svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();
// Create a new SPL token mint with the payer as the mint authority
let mint = CreateMint::new(&mut svm, &payer)
.authority(&payer.pubkey())
.decimals(DECIMALS)
.send()
.unwrap();
// Create a token account for the payer
let token_account = CreateAccount::new(&mut svm, &payer, &mint)
.owner(&payer.pubkey())
.send()
.unwrap();
// Mint tokens into the payer's token account
MintTo::new(&mut svm, &payer, &mint, &token_account, 1000)
.owner(&payer)
.send()
.unwrap();
// Verify balance
let token_account: TokenAccount = get_spl_account(&svm, &token_account).unwrap();
let account_balance = token_account.amount;
assert_eq!(account_balance, 1000)
}

Konsep Utama

Desimal Token

Sebagian besar token menggunakan desimal untuk merepresentasikan jumlah pecahan:

// SOL has 9 decimals
let one_sol = 10_u64.pow(9); // 1_000_000_000 lamports
// USDC has 6 decimals
let one_usdc = 10_u64.pow(6); // 1_000_000 micro-USDC
// Always account for decimals in calculations
let amount_tokens = 100;
let amount_raw = amount_tokens * 10_u64.pow(decimals as u32);

Hubungan Antar Akun

Memahami hubungan antar akun sangatlah penting:

  • Mint Account: Mendefinisikan token (pasokan, desimal, otoritas)
  • Token account: Menyimpan token untuk pemilik tertentu
  • Associated token account: token account deterministik untuk pasangan pemilik+mint
  • Mint Authority: Dapat membuat token baru
  • Freeze Authority: Dapat membekukan token account (opsional)

Pemecahan Masalah

Kesalahan Umum

KesalahanPenyebabSolusi
AccountNotFoundMencoba menggunakan akun yang tidak adaPastikan akun dibuat sebelum digunakan
AccountAlreadyInitializedMencoba menginisialisasi akun yang sudah diinisialisasiPeriksa apakah akun sudah ada sebelum membuat
InsufficientFundsTidak cukup lamport untuk rent atau token untuk transferPastikan pendanaan/pencetakan yang memadai
OwnerMismatchAkun dimiliki oleh program yang salahVerifikasi ID program yang benar saat membuat

Is this page helpful?

Daftar Isi

Edit Halaman
© 2026 Yayasan Solana. Semua hak dilindungi.