Ana içeriğe atla
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 →

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

Özel bir program, işlemin yalnızca sizin programınızın gerçekleştirebileceği diğer zincir üstü durum değişiklikleriyle atomik olarak gerçekleşmesi gerektiğinde anlamlıdır. Yaygın durumlar:
  • Emanet / limit order programları — kullanıcı bir mint’i emanetinize yatırır, programınız bir fiyat koşulunu izler ve tetiklenmesi halinde programınız atomik olarak Raydium’dan swap yapar ve kullanıcının hesabını krediye alır.
  • Toplayıcı proxy’ler — bir swap’ı Raydium + bir veya daha fazla başka DEX’ten geçiren ve tüm atlamaları programınızın sahip olduğu tek bir slippage kontrolü altında tutan tek bir talimat.
  • Otomatik bileşik vault’lar — LP veya farm stake’i vault’unuza yatırın, vault ödülleri belirli bir programa göre hasat eder, likiditeyi yeniden sağlar, hisse token’ları yayınlar.
  • Strateji vault’ları — CLMM üzerinden swap yaparak yeniden dengelenen kaldıraçlı LP pozisyonları; pozisyonları kapatıp teminatı bir işlemde swap eden likidatörler.
  • Özel vesting’li token-lansman platformları — programınız vesting token’larını tutar ve Raydium havuzuna belirli bir programa göre serbest bırakır.
Yalnızca çevrimdışı koddan swap göndermek istiyorsanız CPI aşırı yüktür — SDK’yı kullanın. CPI’nin karmaşıklığı, kendi durum ile atomiklik gereksinimiyken kazanır.

Bileşim desenleri

Desen 1: İnce proxy

Programınız bir politikayu doğrulayan (örn. beyaz listedeki mint çiftleri, doğrulanmış kullanıcılar için ücret indirimi) tek bir talimat ortaya koyan ve ardından Raydium’a iletir.
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

Programınız kullanıcının input mint’ini tutan bir PDA’ya sahiptir. Tetiklenmesi halinde, PDA kendi bakiyesini swap yapmak için Raydium’a bir CPI imzalar.
Kritik detay: PDA, CpiContext::new_with_signer aracılığıyla imzalar. Signer seeds bölümüne bakın.

Desen 3: Bileşik çok-atlama

Programınız bir talimatta birden fazla CPI yayınlar, tümü arasında tek bir slippage sınırı uygular. Raydium swap talimatlardır her birinin kendi minimum_amount_out vardır, ancak bunları 0’a (veya çok gevşek bir tabana) ayarlar ve son atlama sonrasında kesin bir minimum uygularsınız.
Bu size tüm rota için tek bir geri çevirme kapısı verir. Yalnızca her atlama slippage-güvenli olduğuna güvendiğinizde bu deseni kullanın; aksi takdirde, her atlama kendi minimum’unu uygulamaya izin verin.

Desen 4: Vault / strateji

Programınız bir PDA’da LP token’larını veya farm stake’ini tutar. Bir keeper (veya kullanıcı) compound() çağırır, bu:
  1. Farm’dan ödülleri hasat eder.
  2. Ödülleri pool token’ları için swap yapar (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ü tek bir işlemde gerçekleşir, böylece vault’un NAV’ı atomik olarak hareket eder. İşlem bütçesi tipik olarak 600k–1M CU’dur; adres arama tabloları zorunludur.

Hesap listesi inşası

Çağıran programın Accounts yapısı Raydium programının hesap sırasını yansıtır, ancak çoğu Raydium tarafındaki hesap UncheckedAccount’tır çünkü Raydium onları kendisi doğrular. Yalnızca sizin sahip olduğunuz hesaplara kısıtlamalar eklersiniz:
Asimetri — sizin hesaplarınız üzerinde kesin doğrulama, Raydium’unkilerde UncheckedAccount — tembelliktir değil. Alıcı kendi dosyasını doğrular; çağıran üzerinde çift doğrulama sadece CU yakar ve Raydium yeni bir yapı düzeni alanı gönderdiğinde senkronizasyon çıkması riskidir.

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

PDA imzalayan seed’ler

CPI yalnızca authority olarak iletilen PDA, çağıranın söylediği türetmeyle eşleşirse başarılı olur. İkisinin şu konularda anlaşması gerekir:
  1. Seed bayt sırası (burada [b"escrow", user.key().as_ref()]).
  2. Bump.
  3. Çağıran program kimliği (Raydium’unkisi değil, sizin programınız).
Raydium kimin authority olduğunu umursamaz — yalnızca authority imzasının işlemi kapsamasını ve input ATA’nın bu authority’ye ait olmasını umursar. Doğrulama anchor_spl::token::transfer’de gerçekleşir: ATA’nın authority alanı imzalayan ile eşleşmelidir. Yaygın hata: user’ı authority olarak iletmek (ve escrow PDA’sına ait olan escrow_input_ata’dan transfer etmek). SPL Token programı owner mismatch ile reddeder. Her zaman authority alanını ATA sahibi ile eşleştirin.

Kalan hesaplar

Birçok Raydium talimatı, sabit olanlardan sonra eklenen değişken uzunluklu bir hesap listesi alır — kalan hesaplar.
  • CLMM SwapV2: swap yönünde swap’ın geçebileceği tick arrayları için 1–8 TickArrayState hesabı.
  • Farm v6 Deposit / Harvest / Withdraw: (reward_vault, user_reward_ata) çiftleri, canlı her ödül slotu 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. Onları geçirin:
Sıralama önemlidir. CLMM için:
Farm v6 hasat için:
Çağıran programınız istemciden aldığı kalan hesapları değiştirilmemiş olarak iletmelidir. Onları filtrelemeye veya yeniden sıralamaya çalışmayın.

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

Bir CPI kendisi ~1.500 CU’ya mal olur; çağrılan tarafın kendi CU kullanımı üstüne yığılır. Raydium CPI başına kabaca bütçe: Her CPI frame için ~1.500 ve programınızın kendi yükü için ~20.000 ekleyin. harvest → swap A → swap B → deposit LP → stake LP yapan bir otomatik bileşik kolay 700k CU’ya ulaşır. 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 bitecektir.

Hata yayılması

Raydium programları istikrarlı 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:
Hata kodu-anlam eşlemesi IDL politikasına göre program başına istikrarlıdır (sdk-api/anchor-idl); yeni kodlar sonda ekleyerek, mevcut kodlar asla anlam değişikliği yapmaz.

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

Akış:
  1. open_order — kullanıcı amount_in kadarını input_mint’den emanet PDA’ya yatırır; hedef min_amount_out ve son kullanma tarihini kaydeder.
  2. execute_order — herkes (keeper) mevcut pool hesaplarıyla çağırır. Program mevcut teklifi ≥ min_amount_out olup olmadığını kontrol eder, ardından Raydium swap’ı CPI’ye verir ve çıktıyı emanette tutar.
  3. claim — kullanıcı output mint’i emanetten çeker.
Keeper işlem ücretini öder (başka bir yerde bir keeper ücreti alırlar — gösterilmemiştir). Emanet PDA’sı CPI’ye imza atar. Raydium tarafındaki slippage kontrolü ve emanet’in kendi delta kontrolü zemin sınırını uygular — çiftçi kasnak.

Test

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

Bileşime özgü tuzaklar

Yeniden-girişkenlik

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

Hesap değişebilirlik sapması

Programınız bir hesabı mut olarak iletirse ancak Raydium onu salt okunur olarak beklerse (veya tersi), çalışma zamanı çağrıyı InvalidAccountData ile reddeder. Raydium’un talimattının beklenen değişebilirliğini her zaman IDL’de kontrol edin; anchor_cp_swap::cpi::accounts::Swap bunu alan türleriyle zorunlu kılar.

Token-2022 program alanı

Input ve output mint’ler 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 mint’in owner alanını her zaman kontrol edin ve doğru programı her slota yönlendirin.

Sürümlü işlemler

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

İşaretçiler

Kaynaklar: