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 →

Hangi desen hangi programa uygulanır

CPMM, CLMM veya LaunchLab entegre ediyorsanız, önce genel deseni okuyun, ardından hesap listesi ve farklılıklar için programınızın bölümüne gidin. Farm v6 ve AMM v4 bölümlerini bağımsız olarak okumaya değer kadar farklıdır.

Cargo bağımlılıkları

Bağımlılık anahtarı hedef repo’nun [package] name ile tam olarak eşleşmelidir, tireleri de dahil olmak üzere. Cargo, bir git bağımlılığını çözerken raydium_cp_swap ile raydium-cp-swap arasında eşdeğer davranmaz.
branch = "master" en son yayınlanan kaynağı izler; yeniden üretilebilir bir derleme gerekiyorsa belirli bir rev = "<commit>" ile sabitleyin. Prototipleme aşamasını geçtikten sonra bu önerilir, çünkü master üzerinde bir yukarı akış hesap düzeni değişikliği aksi takdirde uyarı olmadan derlemenizi bozacaktır. cpi özellik bayrağı, crate’lerin tam program yerine yalnızca CPI yüzeyine (hesap yapıları + çağırıcılar) derlemesini sağlar, böylece ikili dosyanız küçük kalır. anchor-lang / anchor-spl hedef crate’in sabitlediği ile eşleşmelidir:
Her iki crate’i de aynı Anchor satırından alın. Her iki master dalı da =1.0.2 sabitlediğinden, bir program tek bir crate’ten CPMM ve CLMM’ye CPI yapabilir. Satırları karıştırmak derlemeyi bozar: örneğin, raydium-cp-swap master üzerinde ve raydium-clmm Anchor 1.0 yükseltmesinden önceki bir rev ile sabitlenmiş. Cargo, bir ikili dosyaya Anchor’ın özelliklerinin iki uyumsuz kopyasını bağlamak zorunda kalacaktır. Karışık bir çiftte sıkışıp kaldıysanız, programı ikiye bölün veya bir taraf için yazılı CPI crate’ini bırakın ve bu talimatı elle kodlayın (AMM v4 için gösterilen desen herhangi bir program için çalışır).
Anchor 1.0, her CPI çağrı sitesinin dokunduğu iki şeyi değiştirdi. Çalışan bir entegrasyonu 0.3x kapalı taşıyorsanız:
  • CpiContext::new bir AccountInfo değil, bir Pubkey alır. CpiContext::new(ctx.accounts.cpmm_program.to_account_info(), accts) CpiContext::new(*ctx.accounts.cpmm_program.key, accts) olur. new_with_signer için de aynı. Yapı alanı artık program_id: Pubkey.
  • Context dört değil, bir yaşam süresine sahiptir. Context<'_, '_, 'info, 'info, MyProxySwap<'info>> Context<'info, MyProxySwap<'info>> olur.
İstemci tarafında, anchor-client’ın RequestBuilder::instructions() artık Result<Vec<Instruction>> yerine Vec<Instruction> döndürür (? bırakın) ve CommitmentConfig solana-sdk dışına taşındı — bunun yerine anchor_client adresinden alın. spl-associated-token-account 8.0, yardımcılarını yeni spl-associated-token-account-interface crate’inden yeniden dışa aktarır. get_associated_token_address ve ID hala crate kökünde ulaşılabilir (spl_associated_token_account::{get_associated_token_address, ID}), ancak adres yardımcıları orada kullanımdan kaldırılmıştır — bunun yerine doğrudan spl-associated-token-account-interface bağımlılığını tercih edin ve spl_associated_token_account_interface::address::get_associated_token_address ve spl_associated_token_account_interface::program::ID içeri aktarın. ::address ve ::program arayüz crate’inin modülleri olduğunu unutmayın; spl_associated_token_account::address::… çözümlenmez.
Hesap yapılarını uçtan uca bağlayan çalışan CPI örnekleri için bkz. raydium-io/raydium-cpi-example (AMM v4, CPMM ve CLMM’yi kapsar). En yeni dalı anchor-0.31.0 — henüz Anchor 1.x dalı yok, bu nedenle bu repo’yu hesap yapısı bağlaması için referans olarak değerlendirin, bu sayfanın zorunlu kıldığı sürüm pinleri için değil.

Genel Anchor CPI deseni

Bu bölüm CPMM baştan sona adım adım açıklar: Accounts struct, CpiContext, cpi::<ix>(). CLMM aynı şekli izler, ancak farklı bir hesap listesi ve kalan hesaplar gereksinimi vardır. LaunchLab aynı mekanikleri takip eder, ancak hesap listesi CPMM/CLMM’de olmayan birkaç hesap içerir (global_config, platform_config, event_authority, program), bu nedenle bunu aynı desen olarak değil, aynı şekil olarak değerlendirin. Her programın kendi bölümüne bakın ve bu kılavuzun hesap listesinin doğrudan aktarılabileceğini varsaymayın.

Hesap listesi oluşturma

Her Raydium CPI, çağıran programda bir Accounts struct gerektirir. Alanları, sizin talimatınızın ihtiyaç duyduğu hesaplar ve alan düzeyinde doğrulayıcılardır; bunların bildirim sırası Raydium’un kendi talimat hesap sırasıyla eşleşmek zorunda değildir, çünkü kendi IDL tarafından oluşturulan istemciniz bunları konuma göre değil, ada göre adresler:
Raydium tarafındaki hesapların çoğu UncheckedAccount olarak yazılır, çünkü çağrılan taraf (Raydium) doğrulamaya sahiptir. Çağıran programınız yalnızca sizin sahip olduğunuz hesapları, örneğin kullanıcı ATA’larını ve kendi PDA’larınızı kesin olarak doğrular. /// CHECK: doc-yorumu, Anchor’un eksik kontroller hakkındaki uyarısını bastırır. Raydium tarafındaki tek istisna cpmm_program kendisidir: Raydium’un dahili olarak doğruladığı bir veri hesabı yerine çağrılan program olduğundan, Program<T> olarak yazılır ve manuel bir /// CHECK: yerine Anchor’un otomatik adres kontrolünü alır. Bu çoğunlukla UncheckedAccount şekli, Raydium’un kendi hesaplarını doğruladığı yer, CLMM ve LaunchLab için de aynıdır. Bu örnek her iki mint’in de klasik SPL Token olduğunu varsayar; her iki taraf da Token-2022 mint olabilirse, bir token_program_2022: Program<'info, anchor_spl::token_2022::Token2022> alanı ekleyin ve aşağıdaki CPI çağrısında token_program yerine o tarafın input_token_program/output_token_program olarak geçirin.

CPI çağrısı oluşturma

Anchor, talimat başına bir yardımcı oluşturur ve bir CPI-hesaplar struct’ı (cpi::accounts::Swap, aşağıda CpmmSwap olarak takma ad). Yukarıdaki kendi MyProxySwap struct’ınızdan farklı olarak, bu struct’ın alan adları ve sırası raydium-cp-swap’ın kendi IDL’si tarafından sabitlenir ve tam olarak eşleşmesi gerekir:
cpi::swap_base_input IDL’den oluşturulur; argüman listesi Anchor talimatının argüman listesini yansıtır. Onaylanan her Anchor tabanlı Raydium programı (CPMM, CLMM, LaunchLab) cpi::<ix>() yardımcılarını aynı şekilde oluşturur; işlev adı talimat adıyla snake_case’de eşleşir. Bunun Farm v6’ya kadar uzanıp uzanmadığı onaylanmamıştır; kendi bölümüne bakın.

İmzalayan tohumlar (PDA tarafından imzalanan CPI)

Programınız bir PDA adına CPI’yi imzaladığında (vault’lar, escrow’lar vb. için yaygındır), CpiContext::new_with_signer kullanın:
İmzalayan tohumlar PDA’nın türetilmesiyle eşleşmelidir. authority (veya benzer imzalayan rol) olarak geçirilen herhangi bir hesap için, Solana çalışma zamanı PDA’nın bu tohumlar aracılığıyla imzaladığını kontrol eder.

Kalan hesaplar

Bazı Raydium talimatları kalan hesaplar alır; sabit hesaplardan sonra eklenen değişken uzunlukta bir liste. Anchor’un CPI yardımcıları kalan hesapları tür kontrol etmez; bunları .with_remaining_accounts(...) aracılığıyla geçirin:
Sıra her zaman önemlidir, çünkü alıcı program kalan hesapları geçtiğiniz sırada yineler. İki onaylanan sıralama:
  • CLMM SwapV2: tick dizileri, yönsel olarak sıralanmış.
  • Farm v6: (reward_vault, user_reward_ata) çiftleri, ancak yalnızca ikinci ödül akışından itibaren; gerçek bir işlemin kodunu çözmek ne gösterdiğini görmek için Farm v6 bölümüne bakın.

Deseni uygulama: CLMM

SwapV2 yukarıdaki genel deseni takip eder, ancak farklı bir hesap listesi ve tick dizileri için kalan hesaplar gereksinimi vardır. Crate’in #[program] modülü raydium_clmm olarak adlandırılır; bu aynı zamanda Rust use yoludur.
CPI hesapları struct’ı SwapV2 değil SwapSingleV2 olarak adlandırılır. SwapV2 zincir üstü talimat adıdır.
Tick dizisi listesini SDK’nın yaptığı gibi, sabit bir sayı tahmin etmek yerine geçerli pool durumuna karşı bir alıntı aracılığıyla hesaplayın; geçtiğiniz dizileri aşan bir swap TickArrayNotFound ile geri döner (tam hesap tablosu ve hata listesi için products/clmm/instructions bölümüne bakın). Bunları fiyat yürüyüşünün yönünde geçirin: swap yönündeki ilk dizi ilk olarak.

Deseni Uygulamak: LaunchLab

LaunchLab, Anchor tabanlı ve IDL yayınlıdır: raydium_launchpad/raydium_launchpad.json genel raydium-idl deposunda. Bu IDL’nin iç meta veri tanımlayıcısı raydium_launchpad’dır; bu, ürünün alternatif bir adı değil, temel programın teknik adıdır. CPMM ve CLMM’den farklı olarak, programın kendi kaynağı herkese açık değildir (bkz. reference/program-addresses). Cargo’ya işaret edecek bir git = "..." bağımlılığı yoktur ve gerçek bir crate’in Rust use yolunun ne olacağını doğrulamak için kaynak yoktur. Yayınlanan IDL’den Anchor’ın declare_program! makrosu kullanarak bağlamalar oluşturun. IDL JSON’ını crate’inizde idls/raydium_launchpad.json olarak kaydedin (Cargo, CARGO_MANIFEST_DIR’e göre bir idls/ dizini arar), ardından declare_program!(raydium_launchpad); IDL’den doğrudan raydium_launchpad::cpi::accounts::<Ix> struct’larını ve cpi::<ix>() fonksiyonlarını oluşturur; program kaynağı gerekmez. Oluşturulan accounts-struct adı her zaman instruction adının PascalCase’idir (buy_exact_in → BuyExactIn), ve alan adları IDL’nin account adlarıyla tam olarak eşleşir; aşağıdaki MyProxyBuy’da zaten kullanılan aynı account listesi. CPI şekli genel deseni izler. Aşağıdaki account listesi ve argümanlar, products/launchlab/instructions.mdx’den değil, zincir üstü IDL’nin buy_exact_in instruction’ından gelir:
Mezuniyet sonrasında, hedef program pool_state.migrate_type’a bağlı olarak CPMM veya AMM v4’tür; products/launchlab/accounts.mdx bunun Initialize zamanında ayarlandığını söyler. CPI account listeniz her ikisine de hazırlanmalı veya önce migrate_type’ı PoolState’ten okumalı ve dallanmalısınız.

Hata yayılması

Her Anchor tabanlı Raydium programı kendi hata enum’ını döndürür; Anchor bunları sarmaladığı için, çağıran programınız bunları Err(ProgramError::Custom(code)) olarak görür. Belirli hataları işlemek için:
Çağırdığınız program için ilgili hata türünü değiştirin (raydium_clmm::error::ErrorCode CLMM için, vb.). Hata kodu numaraları IDL politikasına göre kararlıdır (sdk-api/anchor-idl), bu nedenle sayısal değerle karşılaştırarak belirli kodlara karşı test edebilirsiniz. Tam hata tabloları: CPMM, CLMM, AMM v4, Farm v6 ve LaunchLab.

Bileşik CPI’larda işlem bütçesi

Her CPI frame’inin ek yükü vardır ve çağrılanın kendi CU tüketimi sizinkinin üstüne yığılır; bu nedenle programınızın içinden Raydium’a çağrı yapan bir işlem, 200k CU varsayılanına güvenmek yerine açık bir işlem bütçesine ihtiyaç duyar.
Ölçülen, tahmin edilmeyen. Mainnet’te bir CPMM swap_base_input, CPMM programının kendisinde ~23.000 CU tüketir — 2026-09-09’da yüksek hacimli bir havuzda sekiz canlı swap’ta örneklenmiş (22.721–23.052), Program CPMMoo8… consumed N of M compute units günlük satırından okunmuştur. Karşılaştırma için: AMM v4 swap ~26.000; CLMM swap ~41.000; CLMM swap_v2 ~48.000 (43.838–52.887), her tick geçişiyle artar.Bu sayfanın önceki bir revizyonu, bir proxy-swap CPI için ~47.700 CU bildirmiştir. Bu rakam tüm işlem (computeUnitsConsumed) idi; bu, çağıranın kendi programını, CPI frame’ini ve herhangi bir ATA kurulumunu içerir — çağrılanın maliyeti değil. Her ikisi de yararlıdır, ancak bunlar aynı sayı değildir, bu nedenle benzer olanları karşılaştırın. Belgelendirmeden kopyalanan bir sayıya göre bütçe yapmak yerine kendi işleminizi ölçün.
CLMM ve LaunchLab CPI’ları daha pahalıdır (CLMM özellikle remaining_accounts aracılığıyla ek tick dizilerini yürür, dizi başına CU ekler), ancak yukarıdaki yalnızca CPMM rakamı ölçülen bir değerdir. Her zaman belgelendirmeden kopyalanan bir sayıya değil, kendi ölçümünüzden boyutlandırılmış açık bir ComputeBudgetProgram::set_compute_unit_limit(...) instruction’ı ayarlayın; çünkü varsayılan 200k CU sınırı sessizce tükenecek ve programlar yükseltildikçe instruction başına maliyetler değişecektir.

AMM v4: manuel Instruction oluşturma

AMM v4, Anchor’dan önce gelir ve CPI crate’i yoktur; bu, bu belgedeki genel deseni izlemeyen tek programdır. Instruction’ı elle oluşturun:
Tam account listesi için products/amm-v4/code-demos bölümüne bakın.

Farm v6

Entegrasyonunuz için bu bir seçenek ise TS SDK’yı kullanın. raydium.farm.deposit(...) (bkz. products/farm-staking/code-demos) gerçek demolar tarafından uygulanır ve bu program için bir Rust Anchor crate’inin var olup olmadığına bağlı değildir.
Farm v6, Anchor CPI yolu sunmaz. crates.io’da raydium_farm_v6 crate’i yoktur, genel kaynak deposu yoktur ve zincir üstü IDL yoktur — programın ne eski bir anchor:idl hesabı ne de Program Metadata programında bir girişi vardır (bkz. sdk-api/anchor-idl). Bunu Anchor olmayan bir program olarak değerlendirin ve instruction’larını aşağıdaki gibi elle oluşturun.
Yine de Rust CPI’ya ihtiyacınız varsa, örneğin başka bir zincir üstü programdan oluştururken, Instruction’ı elle oluşturun; AMM v4 ile aynı şekilde: gerçek account listesini ve instruction discriminator’larını bağımsız olarak türetin; örneğin SDK’nın TypeScript düzenlerini (raydium-sdk-V2’nin farm modülü) çözerek, gerçek işlemleri doğrudan çözerek (aşağıya bakın) veya dağıtılan programı dökerek ve disassemble ederek. Sıfır argümanlı instruction şekli için, bir harvest veya claim çağrısıyla tutarlı olan, gerçek account sırası sabit bir önek (token_program, farm’ın state hesabı, bir vault-authority PDA, bu PDA’nın ilk reward vault’u, ikinci bir PDA, çağıran ve çağıranın bu ilk reward mint’i için ATA’sı) ve ardından ilk sonrası her reward akışı için remaining_accounts’ta (reward_vault_i, user_reward_ata_i) çiftleridir. Eşleştirme kuralı gerçektir, ancak yalnızca ikinci reward akışında başlar: ilk akışın vault’u ve ATA’sı sabit hesaplardır, birbirinin yanında değildir ve remaining_accounts’ın hiç parçası değildir.

CPI akışını test etme

Yerel geliştirme için Raydium programlarının test validatörünüzde mevcut olması gerekir. Üç seçeneğiniz vardır:
  1. anchor test program klonlaması ile. Dağıtılmış mainnet bytecode’unu yerel validatörünüze çeker; aşağıdaki Programları yerel validatöre klonlama bölümünde Anchor.toml yapılandırması ve özellikle pool oluşturma testlerini zor yapan iki şeyi görebilirsiniz.
  2. Devnet. Raydium çoğu programı devnet’e dağıtır, ancak mainnet’ten farklı program ID’leri ile (CPMM, CLMM, AMM v4, Stable AMM ve LaunchLab’ın her birinin ayrı bir devnet adresi vardır; reference/program-addresses içindeki Devnet tablosuna bakınız). Farm v3/v5/v6 devnet’te güvenilir şekilde yayınlanmaz; canlı API (https://api-v3-devnet.raydium.io/main/info) mevcut durumu gösterir. raydium_clmm’nin paketlenmiş DEVNET_PROGRAM_ID sabitlerini (veya diğer crate’ler için eşdeğerini) kullanıyorsanız, mainnet ID’sinin devnet’te de çalışacağını varsaymayınız. Doğru adreslere sahip olduktan sonra canlı kodu çalıştırmak için anchor test --provider.cluster devnet komutunu çalıştırınız.
  3. Yerel dağıtım. Raydium depolarını klonlayınız (CPMM, CLMM; LaunchLab’ın kaynağı bu seçenek için mevcut değildir) ve yerel validatöre anchor deploy yapınız. Test döngüsü yükü ekler ancak hata ayıklama için çağrılan programı değiştirmenize izin verir.
anchor test ile çalıştırınız veya programı değiştirmiyorsanız önce anchor build yapınız ve test dosyasında yineleme yaparken anchor test --skip-build komutunu çalıştırınız.

Programları yerel validatöre klonlama

Bu, programın kaynağı herkese açık olup olmadığına bakılmaksızın program ID’sine göre çalışır; bu nedenle LaunchLab, kaynağı mevcut olmasa da CPMM ve CLMM ile aynı şekilde klonlanır. reference/program-addresses buradaki her adres için gerçek kaynaktır.
Programı klonlamak, testiniz aynı zamanda bir pool oluşturuyorsa yeterli değildir (zaten var olan bir havuza karşı işlem yapmak yerine). CPMM’nin initialize talimatı, amm_config ve create_pool_fee hesaplarını gerçek zincir üstü verilerine karşı doğrular; bu nedenle bunları da klonlamanız gerekir, aksi takdirde initialize tamamen başarısız olur. CPMM için özellikle: istediğiniz ücret seviyesi AmmConfig’ini klonlayınız (adresini GET https://api-v3.raydium.io/main/cpmm-config adresinden alınız, indeks 0 %0,25 seviyesidir) ve ücret alıcı token hesabını, tam adres tarafından doğrulanmış, anında oluşturulmamış, bu nedenle zaten var olması gerekir.
Testinizin yeni oluşturduğu bir pool aynı anda takas edilemez. CPMM’nin initialize talimatı, kesinlikle gelecekte olmayan istenen open_time’ı sessizce geçersiz kılar (if open_time <= block_timestamp { open_time = block_timestamp + 1 }), bu nedenle startTime: 0 (“hemen aç,” SDK’ya göre) bile pool takas kabul etmeden önce gerçek ≥1 saniyelik bir boşluk bırakır. Bir pool oluşturan ve sıfır gecikmeyle ona karşı işlem yapan bir test NotApproved hatasına çarpar. Pool oluşturma ile ilk takas arasında kısa bir await (1–2s) yeterlidir. Bu test’e özgüdür; bir insan iki ayrı manuel komut çalıştırırsa normalde fark etmez, çünkü yazma ve işlem başlatma zaten bir saniyeden fazla zaman alır.

İşaretçiler

Kaynaklar: