Skip to main content
Bu sayfa yapay zekâ tarafından otomatik olarak çevrilmiştir. İngilizce sürüm esas alınır.İngilizce sürümü görüntüle →
sdk-api/rust-cpi her bir Raydium programını çağırmanın düşük seviye mekaniklerini kapsar. Bu sayfa daha yüksek seviye eşlidir: Raydium’u kendi programınıza neden bileştirebileceğiniz, hangi desen kullanım durumunuza uyar ve uçtan uca ihtiyacınız olan tam yapıştırıcı kod.

CPI’nin doğru araç olduğu durumlar

Özel bir program, işlemin yalnızca sizin programınızın yapabileceği diğer zincir üstü durum değişiklikleriyle atomik olarak gerçekleşmesi gerektiğinde mantıklıdır. Yaygın durumlar:
  • Emanetçi / limit-order programları — kullanıcı bir mint’i emanetçinize yatırır, programınız bir fiyat koşulunu izler ve tetiklendiğinde, programınız Raydium aracılığıyla atomik olarak takas yapar ve kullanıcının hesabını krediye alır.
  • Toplayıcı vekilleri — Raydium + bir veya daha fazla diğer DEX’ler aracılığıyla bir takas yönlendiren tek bir talimat, tüm atlamalar programınıza ait tek bir slippage kontrolü altında.
  • Otomatik bileşik kasalar — LP veya farm stake’i kasanıza yatırın, kasa ödülleri bir programa göre hasat eder, likiditeyi yeniden sağlar, pay tokenları yayınlar.
  • Strateji kasaları — CLMM aracılığıyla takas yaparak yeniden dengelenmiş kaldıraçlı LP pozisyonları; pozisyonları kapatıp teminatı bir işlemde takas eden tasfiye edenler.
  • Özel vesting’li token-başlatma platformları — programınız vesting tokenlarını tutar ve Raydium havuzuna bir programa göre yayınlar.
Sadece çevrimdışı koddan bir takas göndermek istiyorsanız, CPI aşırıdır — SDK’yı kullanın. CPI karmaşıklığını ancak kendi durumunuzla atomiklik gereksinimi olduğunda hak eder.

Bileşim desenleri

Desen 1: İnce vekil

Programınız bazı politikaları doğrulayan (örn. beyaz listeye alınmış mint çiftleri, doğrulanmış kullanıcılar için ücret indirimi) ve ardından Raydium’a ileten tek bir talimat ortaya koymaktadır.
Durum kullanıcının ATA’larında yaşar. Programınız hiçbir token’a sahip değildir. Minimal güven ayak izi.

Desen 2: Emanetçi

Programınız kullanıcının giriş mint’ini tutan bir PDA’ya sahiptir. Tetiklendiğinde, PDA Raydium’a takas yapmak için bir CPI imzalar.
Kritik detay: PDA CpiContext::new_with_signer aracılığıyla imzalar. Bkz. İmzalayan tohumlar.

Desen 3: Bileşik çok-atlamalı

Programınız bir talimatta birden fazla CPI yayınlar ve tüm bunlar arasında tek bir slippage sınırı uygular. Raydium takas talimatlarının her birinin kendi minimum_amount_out değeri vardır, ancak bunları 0’a (veya çok gevşek bir tabana) ayarlarsınız ve son atlamadan sonra kesin bir minimum’u kendiniz uygularsınız.
Bu size tüm rota için tek bir geri dönen kapı verir. Bu deseni yalnızca her atlamanın slippage-güvenli olduğuna güvendiğinizde kullanın; aksi takdirde, her atlamanın kendi minimum’unu uygulamasına izin verin.

Desen 4: Kasa / strateji

Programınız LP tokenlarını veya farm stake’i bir PDA’da tutar. Bir bekçi (veya kullanıcı) compound() çağırır, bu:
  1. Çiftlikten ödülleri hasat eder.
  2. Ödülleri pool tokenları için takas eder (CPMM veya CLMM’ye CPI).
  3. Gelirleri LP’ye geri yatırır (başka bir CPI).
  4. Yeni LP’yi stake eder (başka bir CPI).
Tümü bir işlemde, böylece kasanın NAV’ı atomik olarak hareket eder. İşlem bütçesi tipik olarak 600k–1M CU’dur; adres arama tabloları zorunludur.

Hesap listesi oluşturma

Çağıran programın Accounts yapısı Raydium programının hesap sırasını yansıtır, ancak çoğu Raydium tarafı hesap UncheckedAccount’tır çünkü Raydium bunları kendisi doğrular. Yalnızca sizin sahip olduğunuz hesaplara kısıtlamalar eklersiniz:
Asimetri — kendi hesaplarınızda kesin doğrulama, Raydium’unkilerde UncheckedAccount — tembellik değildir. Alıcı kendi hesaplarını doğrular; çağıran tarafında çift doğrulama sadece CU yakar ve Raydium yeni bir yapı düzeni alanı gönderdiğinde senkronizasyondan çıkma riskini taşır.

CPI çağrısının kendisi

PDA imzalayan tohumlar

CPI yalnızca authority olarak geçirilen PDA, çağıranın iddia ettiği türetme ile eşleşirse başarılı olur. İkisi şu konularda anlaşmalıdır:
  1. Tohum bayt dizisi (burada [b"escrow", user.key().as_ref()]).
  2. Bump.
  3. Çağıran program ID’si (Raydium’unki değil, sizin programınız).
PDA’nın eşleşmesi gereken şeye dikkat edin. CPMM’nin authority yuvası kendi vault PDA’sıdır — sabit, program genelinde bir hesap, kendisiyle türetir ve imzalar ve programınız ne kontrol eder ne de değiştirir. PDA tohumlarınızın uyması gereken hesap payer’dir: kontrol CPMM’nin kendi transfer_from_user_to_pool_vault yardımcısının içinde gerçekleşir, bu da payer olarak geçirilen hesabın input_token_account’ın sahibi olmasını gerektirir. Yaygın hata: escrow_input_ata emanetçi PDA’sı tarafından sahip olunan halde user’ı payer olarak geçirmek. SPL Token programı owner mismatch ile reddeder. Her zaman payer’ı ATA’nın sahibi yapın — ve bu sahip bir PDA olduğunda new_with_signer ile imzalayın.

Kalan hesaplar

Birkaç Raydium talimatı, sabit olanlardan sonra eklenen değişken uzunlukta bir hesap listesi alır — kalan hesaplar.
  • CLMM SwapV2: takas yönünde takas yapabileceği tick dizileri için 1–8 TickArrayState hesabı.
  • Farm v6 Deposit / Harvest / Withdraw: (reward_vault, user_reward_ata) çiftleri, canlı her reward slot başına bir çift.
  • Token-2022 transfer-hook mint’leri: transfer-hook programı artı hook’un ihtiyaç duyduğu hesaplar.
Anchor CPI yardımcıları kalan hesapları tür kontrol etmez. Bunları geçirin:
Sıra önemlidir. CLMM için:
Farm v6 harvest için:
Çağıran programınız istemciden aldığı kalan hesapları değiştirilmemiş olarak geçmelidir. Bunları filtrelemeye veya yeniden sıralamaya çalışmayın.

Bileşik çağrılar için işlem bütçesi

Bir CPI çağrı çerçevesinin kendisi için ~1.500 CU’ya mal olur; çağrılanın kendi CU kullanımı üstüne yığılır. Aşağıdaki çağrılan rakamlar 2026-09-09 tarihinde yüksek hacimli havuzlarda canlı mainnet işlemlerinden ölçülmüştür, Raydium programının kendi çağrısı için Program <id> consumed N of M compute units günlük satırından okunmuştur (bu nedenle iç token-program CPI’lerini içerir): Her CPI çerçevesi ve programınızın üstündeki ek yük için ~1.500 ekleyin. CLMM takas maliyeti tick geçişleriyle ölçeklenir, bu nedenle rakamını bir taban olarak değerlendirin. Token-2022 mint’leri transfer’in uzantı işleme maliyetini ekler; kendi mint’leriniz için düz bir çarpan uygulamak yerine ölçün.
Bu sayfanın önceki revizyonları 5–7× daha yüksek tahminler taşıdı (~150.000 CU CPMM swap, CLMM için ~180.000). Bunlar hiçbir zaman ölçülmedi. Belgelenmiş bir sayıdan değil, kendi computeUnitsConsumed okumanızdan bütçe yapın — ve tam bir işlemin ATA oluşturma, wSOL sarmalama ve işlem bütçesi talimatları sayıldığında Raydium talimatından daha fazlaya mal olduğunu unutmayın.
Her zaman açık bir ComputeBudgetProgram::set_compute_unit_limit ayarlayın:
Varsayılan 200k CU tavanı bileşik bir çağrı tamamlanmadan çok önce sessizce tükenecektir.

Hata yayılması

Raydium’un programları kararlı hata kodlarıyla Anchor hataları döndürür. Çağıran programınız bunları Err(ProgramError::Custom(code)) olarak görür. Varsayılan olarak geçirin:
Veya belirli kodlar için kesintiye uğratın:
ERROR_CODE_OFFSET terimini not edin: #[error_code] varyantları 6000’den başlayarak yayınlanır, bu nedenle çıplak enum ayırıcısına karşı karşılaştırma hiçbir zaman eşleşmez. (anchor-lang veya raydium_cp_swap’ta is_err yardımcısı yoktur — bu sayfanın önceki revizyonları var olmayan bir tane kullandı.) Hata kodu-anlam eşlemesi IDL politikasına göre kararlıdır (sdk-api/anchor-idl); yeni kodlar sonunda eklenir, mevcut kodlar hiçbir zaman anlam değiştirmez.

Tam çalışan örnek: limit-order emanetçi

Akış:
  1. open_order — kullanıcı input_mint’in amount_in’ini emanetçi PDA’sına yatırır; hedef min_amount_out ve son kullanma tarihini kaydeder.
  2. execute_order — herkes (bekçi) mevcut havuz hesaplarıyla çağırır. Program mevcut teklifi min_amount_out ≥ ile kontrol eder, ardından Raydium takas’ı CPI’ler ve çıktıyı emanetçide tutar.
  3. claim — kullanıcı çıkış mint’ini emanetçiden çeker.
Bekçi işlem ücretini öder (başka yerde bir bekçi ücreti alırlar — gösterilmemiş). order PDA, emanetçinin giriş ATA’sına sahip olduğu için payer olarak CPI’yi imzalar; ExecuteOrder bu nedenle CPMM’nin kendi vault PDA’sı için bir pool_authority: UncheckedAccount<'info> alanına da ihtiyaç duyar. Hem Raydium tarafı slippage kontrolü hem de emanetçinin kendi delta kontrolü tabanı uygular — çift güvenlik.

Test

Raydium programlarını entegrasyon testleri için yerel bir doğrulayıcıya çekmek (Anchor.toml’den):
Testleriniz gerçekten takas yürütebilmesi için havuz durumu hesaplarını da klonlayın; anchor test başlangıçta bunları mainnet’ten getirir. Bkz. sdk-api/rust-cpi.

Bileşime özgü tuzaklar

Yeniden giriş

Solana’nın gerçek yeniden girişi yoktur — bir CPI aynı çağrıda kaynak programına geri çağrı yapamaz. Ancak yine de kendinizi mantıksal yeniden girişe inşa edebilirsiniz: durumunuzu okuyan bir CPI, ardından kodunuz CPI’nin bunu değiştirmediğini varsayarak yeniden okur. Raydium için, CPI’ler durumunuza dokunmaz, bu nedenle bu örn. flash-loan bağlamlarından daha az bir endişedir. Ancak Raydium’u bir borç verme protokolüyle bileştirirseniz, farkında olun.

Hesap değişebilirlik kayması

Programınız bir hesabı mut olarak geçerse ancak Raydium salt okunur olmasını beklerse (veya tersi), çalışma zamanı InvalidAccountData ile çağrıyı reddeder. Her zaman Raydium’un talimatının beklenen değişebilirliğini IDL’de kontrol edin; raydium_cp_swap::cpi::accounts::Swap her hesabın değişebilirliğini sizin için ayarlar, CPMM’nin kendi Swap yapısındaki #[account(mut)] işaretleyicilerinden — türetilen alanlar tümü düz AccountInfo<'info>’dir, bu nedenle bayrakları taşıyan şey alan türleri değil, türetilen ToAccountMetas impl’idir.

Token-2022 program alanı

Giriş ve çıkış mint’leri farklı token programları altında olabilir — biri SPL Token, biri Token-2022. CPI bu nedenle ayrı input_token_program ve output_token_program alanlarına sahiptir. Her zaman her mint’in owner alanını kontrol edin ve doğru programı her yuvaya yönlendirin.

Sürümlü işlemler

2+ Raydium CPI’si artı bir ATA oluşturma yapan bileşik bir tx nadiren eski (v0-LUT olmadan) bir işleme sığar. V0’ı adres arama tabloları ile kullanın; raydium.getRaydiumLutAddresses() aracılığıyla Raydium’un genel LUT’larını çekin.

İşaretçiler

Kaynaklar: