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 addresslet token_account = Keypair::new(); // Random addresslet create_ix = system_instruction::create_account(&payer.pubkey(),&token_account.pubkey(), // Any address you wantrent,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 + mintlet 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 Programlet (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 itlet payer = Keypair::new();svm.airdrop(&payer.pubkey(), 10 * LAMPORTS_PER_SOL).unwrap();// Create a new SPL token mint with the payer as the mint authoritylet mint = CreateMint::new(&mut svm, &payer).authority(&payer.pubkey()).decimals(DECIMALS).send().unwrap();// Create a token account for the payerlet token_account = CreateAccount::new(&mut svm, &payer, &mint).owner(&payer.pubkey()).send().unwrap();// Mint tokens into the payer's token accountMintTo::new(&mut svm, &payer, &mint, &token_account, 1000).owner(&payer).send().unwrap();// Verify balancelet 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 decimalslet one_sol = 10_u64.pow(9); // 1_000_000_000 lamports// USDC has 6 decimalslet one_usdc = 10_u64.pow(6); // 1_000_000 micro-USDC// Always account for decimals in calculationslet 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
| Kesalahan | Penyebab | Solusi |
|---|---|---|
AccountNotFound | Mencoba menggunakan akun yang tidak ada | Pastikan akun dibuat sebelum digunakan |
AccountAlreadyInitialized | Mencoba menginisialisasi akun yang sudah diinisialisasi | Periksa apakah akun sudah ada sebelum membuat |
InsufficientFunds | Tidak cukup lamport untuk rent atau token untuk transfer | Pastikan pendanaan/pencetakan yang memadai |
OwnerMismatch | Akun dimiliki oleh program yang salah | Verifikasi ID program yang benar saat membuat |
Is this page helpful?