Solana’daki her işlem gören varlık — Raydium havuzunun her temel ve teklif varlığı dahil — iki programdan biri tarafından basılan bir tokendır: eski SPL Token programı veya onun halefi olan Token-2022. Bunlar farklı adreslerde bulunan ayrı programlardır ve farklı hesap düzenlerine ve uzantı semantiklerine sahiptir. Raydium her ikisini destekler, ancak her yerde değil: CPMM, CLMM ve Farm v6 Token-2022 mintlerini kabul eder; AMM v4 ise kabul etmez. Herhangi bir havuzla entegrasyondan önce bu ayrımı anlamak çok önemlidir.
İki program
| SPL Token | Token-2022 |
|---|
| Program ID | TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA | TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb |
| Piyasaya sürülüş | 2020 | 2022 |
| Hesap boyutu (token hesabı) | 165 B | 165 B + uzantılar (değişken) |
| Uzantılar | Hayır | Evet — 17+ resmi uzantı |
| Eski uyumluluk | Tam | Mint başına tercih etmeye bağlı |
Her ikisi de Solana Labs ekibi (şu anda Anza) tarafından yönetilir ve solana-program-library deposu altında bulunur.
Neden iki program?
SPL Token, ileri uyumluluk için dondurulmuştur — bytekodu etkili bir şekilde değişmezdir ve tüm ekosistem için temiz bir temel oluşturur. Kullanım alanları büyüdükçe (stablecoin’ler aktarım ücreti istediğinde, kurumsal mintler nüanslı dondurma yetkilerine ihtiyaç duyduğunda, NFT’ler meta veri işaretçilerine ihtiyaç duyduğunda), Solana ekibi SPL Token’ı yükseltmek yerine ayrı bir genişletilebilir program olarak Token-2022’yi tanıttı. Bu, mevcut entegrasyonları korur ve her minti tam ihtiyacı olan uzantılara tercih etmesine izin verir.
Token-2022, işlevsellikte kesin bir üst küme olmasına rağmen, adres alanında değildir: iki program bir arada var olur ve belirli bir adresdeki bir mint tam olarak birinin altında bulunur.
Hesap yapısı
Mint hesabı
Bir tokenin kimliğini tanımlar.
SPL Token mint (82 bayt):
u32 mint_authority_option
Pubkey mint_authority
u64 supply
u8 decimals
bool is_initialized
u32 freeze_authority_option
Pubkey freeze_authority
Token-2022 mint: aynı temel düzen, plus tabandan sonra sıfır veya daha fazla uzantı TLV (type-length-value) kaydı eklendi.
Token hesabı
Belirli bir mint’in belirli bir sahip için bakiyesini tutar.
SPL Token hesabı (165 bayt):
Pubkey mint
Pubkey owner
u64 amount
u32 delegate_option
Pubkey delegate
u8 state // initialized, frozen
u32 is_native_option
u64 is_native
u64 delegated_amount
u32 close_authority_option
Pubkey close_authority
Token-2022 hesabı: aynı temel yapı, herhangi bir uzantı aktifse uzantı TLV kayıtları.
Token-2022 uzantıları
Uzantılar, mintlere veya hesaplara eklenebilen modüler özelliklerdir. Her uzantı ayrı bir TLV kaydıdır. Raydium için önemli olanlar:
Aktarım ücreti
Mint, her aktarımda yüzdelik bir ücret talep edebilir. Ücret, yapılandırılmış bir geri çekme otoritesine gider. Raydium CPMM ve CLMM tarafından SwapV2 aracılığıyla desteklenir — program döviz kuru hesaplanırken ücreti hesaba katarak havuz matematiği tutarlı kalır.
let extension = TransferFeeConfig {
transfer_fee_config_authority,
withdraw_withheld_authority,
withheld_amount: 0,
older_transfer_fee: ...,
newer_transfer_fee: ...,
};
Aktarım kancası
Mint, çalışma zamanının her aktarımda çağırdığı bir programa işaret eder. Kanca programı aktarımı reddedebilir veya yan etkiler gerçekleştirebilir (uyum durumunu güncelleme, günlüğe kaydetme vb.). Raydium CPMM/CLMM, kancayı SwapV2 aracılığıyla çağırır — işlem, kanca programını ve ihtiyacı olan ek hesapları içerir.
Faiz getiren
Zincir üzerindeki bakiye, yapılandırılmış bir oranda faiz tahakkuk eder. Gerçek mint yerine yalnızca ekranda gösterilir (bakiyeler zaman içinde daha yüksek görünür); temel arz değişmez.
Mint kapatma yetkisi
Arz sıfıra ulaştığında minti kapatmaya izin verir.
Kalıcı temsilci
Belirtilen bir cüzdan, herhangi bir hesaptan koşulsuz olarak token’ları aktarabilir veya yakabilir. Raydium, bu uzantıya sahip mintler için havuz oluşturmayı engeller — havuz rezervlerinin ele geçirilemeyeceği değişmezine uyumsuzdur.
Aktarılamaz
Token’lar basıldıkları hesaptan taşınamaz. Raydium havuz oluşturmayı engeller — işlem göremeyen bir varlık, LP havuzunun temel veya teklif varlığı olamaz.
Varsayılan hesap durumu
Bu mint için yeni token hesapları varsayılan olarak dondurulmuştur ve dondurma otoritesi tarafından çözülmelidir. Kullanılabilir ancak nadirdır.
Gizli aktarım
Bakiye ve aktarım tutarları şifrelenmiş. Raydium, gizli aktarım mintlerini desteklemez (havuz matematiği açık metin bakiyeler gerektirir).
Token-2022 mintleri için Metaplex meta verilerinin yerini alır. Raydium havuz listeleri için desteklenir.
Grup / Üye işaretçisi
Bir minti bir gruba ait olarak bildirir (ör. NFT koleksiyonu). Bilgilendirici; Raydium bunu görüntüleme için kullanır.
Tam liste için resmi Token-2022 uzantıları sayfasına bakın.
Hangi Raydium ürünleri neleri destekler
| Ürün | SPL Token | Token-2022 | Notlar |
|---|
| AMM v4 | Evet | Hayır | OpenBook entegrasyonu SPL Token gerektirir |
| CPMM | Evet | Evet | Token-2022 havuzları için SwapV2 gerektirir |
| CLMM | Evet | Evet | Token-2022 havuzları için SwapV2 gerektirir |
| Farm v6 | Evet | Evet | Stake mint ve reward mint’leri için desteklenir |
| LaunchLab | Evet | Evet | Mezun CPMM havuzları Token-2022 desteğini devralır |
Raydium havuzları için mint uygunluğu — listelenenler hariç tüm uzantılara izin verilir:
- Engellenen: aktarılamaz, kalıcı temsilci, gizli aktarım, varsayılan hesap durumu (reddedilen yapılandırmalarda).
- Uyarı ile izin verilen (LP riski kabul etmelidir): aktarım ücreti, aktarım kancası, dondurma otoritesi etkin.
- Tamamen izin verilen: faiz getiren, meta veri işaretçisi, grup işaretçisi, mint kapatma yetkisi.
getPoolInfoFromRpc yanıtı, mintin uzantı bayraklarını içerir — istemciler LP yapmadan önce kontrol etmelidir.
Token hesabı standartları
İlişkili Token Hesabı (ATA)
Her iki program da İlişkili Token Hesabı kuralını paylaşır: [owner, programId, mint] üzerinden İlişkili Token Programı (ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL) aracılığıyla türetilen bir PDA. Solana’daki hemen hemen her kullanıcı token hesabı bir ATA’dır.
import { getAssociatedTokenAddressSync } from "@solana/spl-token";
// SPL Token
const ata = getAssociatedTokenAddressSync(mint, owner);
// Token-2022
const ata22 = getAssociatedTokenAddressSync(
mint,
owner,
false, // allowOwnerOffCurve
TOKEN_2022_PROGRAM_ID,
);
ATA programı, mintin hangi programa ait olduğuna göre uygun token programına ait hesaplar oluşturur.
ATA olmayan token hesapları
Bir cüzdan, tek bir mint için birden fazla token hesabına sahip olabilir; ATA sadece kuralın adıdır. Havuz hazıneları, örneğin ATA değildir — bunlar havuz programının PDA’ları olup havuzun rezervlerini tutarlar.
Mintin hangi programa ait olduğunu tespit etme
Her mintin hesabının, SPL Token veya Token-2022’yi gösteren bir owner alanı vardır:
const mintInfo = await connection.getAccountInfo(mintPubkey);
if (mintInfo.owner.equals(TOKEN_PROGRAM_ID)) {
console.log("SPL Token mint");
} else if (mintInfo.owner.equals(TOKEN_2022_PROGRAM_ID)) {
console.log("Token-2022 mint");
}
Raydium SDK bu tespiti otomatik olarak işler — getPoolInfoFromRpc istemcilerin doğru ATA’lar oluşturabilmesi için token başına uygun programId’yi döndürür.
Program tarafından swap talimatları
Raydium’un CPMM ve CLMM’nin her biri iki swap talimatına sahiptir:
| Talimat | Desteklenen Mintler |
|---|
Swap / SwapBaseInput (eski) | Sadece SPL Token |
SwapV2 / SwapBaseInputV2 | SPL Token ve Token-2022 her ikisi |
SwapV2 ek hesaplar alır: her iki taraf için mint hesapları, her taraf için token programı (farklı olabileceğinden), ve — aktarım kancası mintleri için — kanca programı ve gereken hesapları.
İstemciler, en az bir taraf Token-2022 olduğunda SwapV2’yi her zaman kullanmalıdır; SwapV2 SPL-only havuzlar için de çalışır, ancak eski Swap işlem gücünde daha ucuzdur.
SDK doğru varyantı otomatik olarak seçer.
SPL Token projesini Token-2022’ye geçirme
Token-2022, mint düzeyinde bir değiştirme değildir — X adresinde bir mint ya SPL ya da Token-2022’dir ve bu oluşturulurken sabittir. “Geçirmek” için şunları yapmalısınız:
- İstediğiniz uzantılarla Token-2022 altında yeni bir mint oluşturun.
- Eski SPL mint sahiplerine yeni mint için takas/sarmalama mekanizması sağlayın.
- Tüm LP havuzları, çiftlikleri ve entegrasyonları yeni minti referans edecek şekilde güncelleyin.
Bu ağırdır. Çoğu proje SPL altında başlar ve belirli bir uzantı ihtiyacı taşımaya zorlamamadığı sürece SPL altında kalır.
Örnek çalışma: Aktarım ücreti ile Token-2022 mint oluşturma
import {
Connection, Keypair, SystemProgram, Transaction, sendAndConfirmTransaction,
} from "@solana/web3.js";
import {
TOKEN_2022_PROGRAM_ID, ExtensionType, createInitializeMintInstruction,
getMintLen, createInitializeTransferFeeConfigInstruction,
} from "@solana/spl-token";
const connection = new Connection("https://api.mainnet-beta.solana.com");
const payer = Keypair.generate();
const mint = Keypair.generate();
const extensions = [ExtensionType.TransferFeeConfig];
const mintLen = getMintLen(extensions);
const rentLamports = await connection.getMinimumBalanceForRentExemption(mintLen);
const tx = new Transaction().add(
SystemProgram.createAccount({
fromPubkey: payer.publicKey,
newAccountPubkey: mint.publicKey,
space: mintLen,
lamports: rentLamports,
programId: TOKEN_2022_PROGRAM_ID,
}),
createInitializeTransferFeeConfigInstruction(
mint.publicKey,
payer.publicKey, // transfer fee authority
payer.publicKey, // withdraw-withheld authority
50, // 50 bps = 0.5%
BigInt(1_000_000), // max fee per transfer (smallest units)
TOKEN_2022_PROGRAM_ID,
),
createInitializeMintInstruction(
mint.publicKey,
9, // decimals
payer.publicKey, // mint authority
null, // freeze authority
TOKEN_2022_PROGRAM_ID,
),
);
await sendAndConfirmTransaction(connection, tx, [payer, mint]);
Bu mint, Raydium CPMM havuzuna LP olabilir; değiş tokuşçular havuzun swap ücreti üzerine %0.5 aktarım ücreti ödeyecekler.
Güvenlik değerlendirmeleri
Bir Token-2022 minte LP yapmadan veya onun aracılığıyla değiş tokuş yapmadan önce:
freeze_authority’yi kontrol edin. Null değilse ve merkezi bir taraf tarafından tutuluyorsa, sizin ATA’nızı (ve tartışmalı şekilde havuz hazinesini) dondurabilirler.
transfer_hook’u kontrol edin. Kanca programı aktarımları keyfi olarak engelleyebilir — kanca kaynağı hakkında araştırma yapın.
transfer_fee’yi kontrol edin. Beklenen swap çıktısında ücreti hesaba katın.
permanent_delegate ve non_transferable’u kontrol edin. Raydium’un programı bunları reddeder, ancak özel entegrasyon oluşturuyorsanız doğrulayın.
Tam risk kabul çerçevesi için security/oracle-and-token-risks’a bakın.
İşaretçiler
Kaynaklar: