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 →
Bu sayfa
products/clmm/accounts (hesaplar nedir) ve products/clmm/math (matematik nedir) ile birlikte kullanılır. Argümanlar ve hesap sıralaması için yetkilidir; belirli bayt düzenleri IDL’den gelir.Talimat envanteri
Çoğu yönetici tarafından yapılan talimat (
CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) programın sabit kodlanmış admin genel anahtarı tarafından kapılanır. CreatePermissionPda / ClosePermissionPda admin genel anahtarını veya özel permission_pda_admin anahtarını kabul eder. Ödül akışı yönetici talimatları (TransferRewardOwner, CollectRemainingRewards) program yöneticisi değil, ödül fon sağlayıcısı tarafından kapılanır.
V2 soneki “Token-2022’yi kasa / NFT’de destekler, bitmap uzantı yuvası gerektirir” anlamına gelir. SDK yeni havuzlar için varsayılan olarak V2’yi seçer.
CreatePool
Argümanlar
Ön koşullar
token_mint_0 < token_mint_1bayt sırasına göre.amm_config.disable_create_pool == false.- Mint’ler Token-2022 uzantısı izin listesi tarafından reddedilmez.
pool_state.sqrt_price_x64 = sqrt_price_x64,tick_current = floor(log_{1.0001}(price)).pool_state.liquidity = 0(henüz pozisyon yok).pool_state.fee_on = FromInput(eski varsayılan).pool_state.dynamic_fee_infosıfırlanır (dinamik ücret devre dışı).
CreateCustomizablePool
Yeni havuzlar için önerilir. CreatePool ile aynı etki artı havuz başına ücret toplama modu ve isteğe bağlı dinamik ücret katılım bayrağı.
Argümanlar
CreatePool ile aynı artı, enable_dynamic_fee = true olduğunda:
Ön koşullar —
CreatePool ile aynı. enable_dynamic_fee = false ise, dynamic_fee_config yoksayılır.
Son koşullar
pool_state.fee_onseçilenCollectFeeOnvaryantına ayarlanır.- Dinamik ücret etkinleştirilirse:
pool_state.dynamic_fee_infosağlananDynamicFeeConfigöğesinden başlatılır (beş kalibrasyon parametresi kopyalanır; durum alanları sıfırlanır). - Aksi takdirde:
pool_state.dynamic_fee_infosıfırlanır (= bu havuz için dinamik ücret sonsuza kadar etkin değil).
fee_on ve dinamik ücret etkinleştirme biti yalnızca havuz oluşturma sırasında ayarlanır. Yerinde yükseltme yoktur — eski CreatePool aracılığıyla oluşturulan havuzlar geriye dönük olarak dinamik ücret veya tek taraflı ücret kazanamaz. Yeni dağıtımlar varsayılan olarak bu talimata geçmelidir.
CreatePermissionedPool
Hem CreatePool hem de CreateCustomizablePool havuz PDA’sını ["pool", amm_config, token_mint_0, token_mint_1] öğesinden türetir, bu nedenle (config, mint0, mint1) üçlüsü başına tam olarak bir kanonik havuz adresi vardır — aynı seed’lerde ikinci bir init başarısız olur. CreatePermissionedPool istemci tarafından sağlanan seed_index: u16 öğesini havuz PDA seed’lerine katarak bu kısıtlamayı kaldırır; aynı çift ve ücret seviyesi için birden fazla havuza izin verir — her biri kendi adresinde. Keyfi bir havuz adresi ayrıcalıklı bir yetenek olduğundan, ödeyici bunu yetkilendiren bir Permission PDA’sı tutmalıdır.
Havuzun diğer her şeyi CreateCustomizablePool ile aynıdır: aynı CreateCustomizableParams öğesini alır ve tek taraflı ücret ve dinamik ücret katılımını destekler.
Argümanlar
CreateCustomizablePool ile aynı artı, başında:
pool_state PDA’sı ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()] öğesinden türetilir.
Ön koşullar
seed_index != 0.0değerindekiseed_indexeski havuzlar için ayrılmıştır ve burada reddedilir;[0, 0]seed bileşeni, eski bir havuz adresinin klasik dört seed formuna çökmesini sağlayan şeydir.payeriçinpermissionPDA’sı var (yönetici tarafındanCreatePermissionPdaaracılığıyla oluşturulmuş).CreatePoolile aynı mint / izin listesi kuralları.
- Yeni bir
pool_stateseed_indextüretilmiş adresinde var;pool_state.seed_index = seed_index. - Diğer tüm son durum
CreateCustomizablePoolile eşleşir (ücret modu, isteğe bağlı dinamik ücret).
Bu talimat genel havuz oluşturma erişimini genişletmez — izinsiz oluşturma
CreatePool / CreateCustomizablePool aracılığıyla devam eder; bunlar çift başına bir havuz kalır. CreatePermissionedPool beyaz listeye alınan bir operatörün aynı çift için birden fazla havuza ihtiyaç duyduğu (örn. farklı başlangıç fiyatları veya başlatma kohortları) ve yönetici tarafından verilen Permission PDA’sı tuttuğu belirli durum için vardır.OpenPositionV2 / OpenPositionWithToken22Nft
Mevcut bir havuz içinde yeni bir pozisyon oluşturun.
Argümanlar
Matematik —
products/clmm/math öğesine bakın. base_flag verildiğinde, program liquidity veya (amount_0_max, amount_1_max) öğesini gerçek L ve tüketilen gerçek token tutarlarına çözer.
Ön koşullar
tick_lower < tick_upper, her ikisi depool.tick_spacingkatları,[MIN_TICK, MAX_TICK]içinde.- Gerekli tick dizileri geçilir ve başlatılır (veya işlemde
InitTickArrayCPI aracılığıyla burada oluşturulur). - Kullanıcı kaynak ATA’larında en az
amount_0_maxveamount_1_maxöğesine sahiptir.
personal_positionvar,liquidityayarlanmış,fee_growth_inside_lastanlık görüntüsü alınmış.- Tick dizisi girdileri
tick_lowervetick_upperöğelerinde güncellenir (liquidity_gross += L,liquidity_net ± L, ücret büyümesi anlık görüntüleri korunur). pool_state.liquidity += Lpozisyon aralıkta ise (tick_lower ≤ tick_current < tick_upper).- Pozisyon NFT mint’i
pool_stateöğesini dondurma yetkilisi olarak kaydeder. Mint yetkilisi tek NFT basıldıktan sonra kaldırılır. Dondurma yetkilisini kaydetmek NFT token hesabının durumunu değiştirmez. - NFT token hesabı, talimat
OpenPositionV2veyaOpenPositionWithToken22Nftve kasa mint’lerinden herhangi birinin dondurma yetkilisi CLMM’nin kısıtlı yayıncı listesiyle eşleşmediği sürece donmuş kalır. Yalnızca eşleşen V2 yolu hesabı dondurur.OpenPositionV1 dondurmaz.
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (çok fazla tick dizisi ise).
Pozisyon dondurma, bildirilen talimat hesaplarını veya argümanlarını eklemez. İstemciler bu pozisyonları mevcut V2 düzenleriyle açabilir. Davranış
vault_0_mint ve vault_1_mint öğesinden zincir üzerinde seçilir.IncreaseLiquidityV2
Zaten açık olan bir pozisyona likidite ekleyin.
Argümanlar
OpenPosition gibi NFT mint’i hariç (pozisyon zaten var; NFT 1 token tutan sahibinin ATA’sı olarak geçilir).
Etki
amount_0_actual/amount_1_actualöğesini kullanıcıdan → kasalara aktarır.personal_position.liquidityvepool_state.liquidity(aralıkta ise) ve uç nokta tick’iliquidity_gross/liquidity_netöğesini artırır.- Son dokunuştan bu yana borçlu olunan ücretleri ve ödülleri toplar ve
tokens_fees_owed_{0,1}/reward_amount_owedöğesine kredi verir. Bunlar yalnızcaDecreaseLiquidityveyaCollectRewardöğesinde ödenir, artışta değil.
DecreaseLiquidityV2
Bir pozisyondan likiditeyi kaldırın.
Argümanlar
IncreaseLiquidity ile aynı şekil.
Etki
- Geçerli
sqrt_price_x64verilen kaldırılanLiçin(amount_0, amount_1)öğesini hesaplar. - Son dokunuştan bu yana tahakkuk eden ücretleri/ödülleri kapatır;
IncreaseLiquidityile aynı. amount_0 + fees_owed_0veamount_1 + fees_owed_1öğesini kasalardan kullanıcıya aktarır.- Likidite sayaçlarını azaltır; yeni
personal_position.liquidity == 0ise, pozisyonClosePositioniçin uygun hale gelir.
amount_0_min ve amount_1_min kullanıcının çıktı tarafında Token-2022 transfer ücretleri net olarak kabul ettiği minimumlar.
ClosePosition
Pozisyon NFT’sini yakın ve PersonalPositionState öğesini kapatın.
Bildirilen hesaplar
Kalan hesaplar
- Donmuş olmayan NFT: hiçbiri gerekli değil; ekstra havuz hesabı zararsızdır çünkü işleyici onu okumaz.
- Donmuş NFT:
personal_position.pool_idöğesini ilk kalan hesap olarak ekleyin. Program bunuPoolStateolarak yükler ve çözmek için PDA seed’lerini kullanır.
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Tüm ödül sayaçları
reward_amount_owed == 0.
- NFT token hesabı donmuşsa, ilk kalan hesabın
personal_position.pool_idöğesine eşit olduğunu doğrular, sonra havuz PDA’sı ile çözer. - NFT’yi yakar.
- NFT token hesabını ve
personal_positionöğesini kapatır; kirayınft_owneröğesine geri verir. Pozisyon NFT’si Token-2022 kullanıyorsa, NFT mint’ini de kapatır; klasik SPL Token mint’leri kapatılamaz ve sıfır arzla kalır.
AccountLack ile başarısız olur. Her kapatma için havuzu geçmek en basit uyumlu stratejidir.
SwapV2
Likidite eğrisini yürüyün; is_base_input öğesine bağlı olarak tam giriş veya tam çıkış.
Argümanlar
Arayanlar beklenen swap yürüyüşünü kapsayan sıralanmış bir tick dizileri listesi geçer; program ihtiyaç duyduğu kadarını kullanır. SDK bu listeyi
PoolUtils.computeAmountOutFormat veya API’nin alıntı uç noktası aracılığıyla hesaplar.
Ön koşullar
pool_state.statusswapa izin verir.now >= open_time.sqrt_price_limit_x64yön içinsqrt_price_x64öğesinin doğru tarafında.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
SwapV2 öğesinin arayanların bilmesi gereken dahili olarak yaptığı şey (2025 sonrası sürüm):
- Dinamik ücret ek ücreti —
pool.dynamic_fee_infosıfır değilse, program son swaptan bu yana geçilen tick mesafesini kullanarak oynaklık biriktiricisini günceller (filtre/bozunma kurallarıproducts/clmm/feesöğesinden) veAmmConfig.trade_fee_rateöğesinin üzerinedynamic_fee_componentekler. Toplam ücret %10 ile sınırlandırılır (MAX_FEE_RATE_NUMERATOR / 1_000_000). - Limit emri eşleştirmesi — fiyat yürüyüşü açık limit emirleri tutan bir tick’i geçtiğinde, program önce o tick’te mevcut limit emri likiditeyi doldurur (FIFO
order_phaseöğesine göre), sonra LP likidite eğrisi boyunca ilerler. Doldurulmuş tutarlartick.unfilled_ratio_x64vetick.part_filled_orders_remainingöğesini daha sonraki kapatma için günceller; emirler kendileri sahibiSettleLimitOrderçağırana kadar harcı olmaz. - Tek taraflı ücret yönlendirmesi —
pool.fee_on = Token0OnlyveyaToken1Onlyolduğunda, swap adımı yine de aynı giriş-çıkış ticaretini hesaplar; ücret daha sonra yapılandırılan tarafa yönlendirilir. Yapılandırılan ücret tarafının çıkış olduğu yönler için, ücret swap çıkışından düşülür (kullanıcıout − feealır); yapılandırılan tarafın giriş olduğu yönler için davranışFromInputile eşleşir.PoolStateöğesindeis_fee_on_input(zero_for_one)veis_fee_on_token0(zero_for_one)öğesine bakın.
Swap (V1) SwapV2 ile aynı dinamik ücret, tek taraflı ücret yönlendirmesi ve limit emri eşleştirmesini uygular; eksik olduğu tek özellik Token-2022 desteğidir — her iki kasa da klasik SPL Token olmalıdır. Herhangi bir Token-2022 mint’i olan havuzlar SwapV2 aracılığıyla değiştirilmelidir. Toplayıcı ve SDK zaten her CLMM bacağı için V2’yi tercih eder, bu nedenle arayanlar mint türüne göre dallanmak zorunda değildir.
OpenLimitOrder
Belirli bir tick’te satış emri verin. Emir, tick başına FIFO kohortunda oturur ve fiyat geçtikçe doldurulur.
Argümanlar
Hesap listesi değişikliği (2026-07 sürümü).
OpenLimitOrder artık giriş tarafına ek olarak çıkış tarafı hesaplarını da alır — output_token_account, output_vault ve output_vault_mint. Bunlar yalnızca doğrulama için kullanılır: program sahibinin giriş veya çıkış token hesabı donmuşsa emri reddeder. Bu, doldurmanın gerçekten sahibinin çıkış ATA’sına kapatılabileceğini garanti eder; bu, izin listesi / varsayılan donmuş Token-2022 mint’leri (örn. izinli tokenler) için önemlidir; burada bir hesap henüz çözülmemiş olabilir. Eski tek taraflı hesap listesine karşı oluşturulan istemciler üç çıkış hesabını eklemelidir.- Ne
input_token_accountne deoutput_token_accountdonmuş değildir (aksi takdirdeNotApproved). pool_state.statushem swap (bit 4) hem de limit emri (bit 5) işlemlerine izin verir (aksi takdirdeNotApproved).tick_index % pool.tick_spacing == 0ve[MIN_TICK, MAX_TICK]içinde.tick_indexseçilen yön içinpool.tick_currentöğesinin sağ tarafında (token0 satışı → tick geçerli olmalıdır, ve tersi). Zaten geçilmiş bir tick’te satış hemen eşleştirilir ve reddedilir.
limit_ordervar; açılış zamanındatick.order_phasevetick.unfilled_ratio_x64anlık görüntüsü alınmış.tick.orders_amount += amount(geçerli kohortunda).limit_order_nonce.order_nonce += 1.OpenLimitOrderEventyayınlandı.
NotApproved (giriş veya çıkış token hesabı donmuş veya havuzun swap / limit emri devre dışı), InvalidLimitOrderAmount (sıfır veya havuzun minimumunun altında), InvalidTickIndex ([MIN_TICK, MAX_TICK] dışında veya seçilen yön için tick_current öğesinin yanlış tarafında), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.
IncreaseLimitOrder
Mevcut açık emre ekleyin. Yalnızca emrin owner öğesi tarafından çağrılabilir.
Argümanlar
OpenLimitOrder gibi nonce hesabı hariç; limit_order PDA’sı doğrudan geçilir.
Ön koşullar
limit_order.owner == signer.- Emir hala aynı kohortda (
tick.order_phase == limit_order.order_phase). Kohort zaten doldurulmaya başlamışsa, emir kısmen kapatılmıştır — çağıran önceDecreaseLimitOrderveyaSettleLimitOrderçağırmalıdır.
amountöğesini sahibi ATA’sındaninput_vaultöğesine aktarır.limit_order.total_amount += amount;tick.orders_amount += amount.
DecreaseLimitOrder
Açık emri azaltın veya tamamen iptal edin. Doldurulmayan kalanı sahibine geri ödeyin, artı geçmiş kısmi doldurmalar tarafından zaten kapatılan çıktı.
Argümanlar
Etki
- Emrin doldurulmuş tutarını açılıştan bu yana kohortun
unfilled_ratio_x64öğesinden yeniden hesaplar. - Doldurulmuş çıktıyı
output_token_accountöğesine gönderir. amountdoldurulmayan girişiinput_token_accountöğesine geri gönderir.limit_orderöğesini buna göre günceller. Yeni doldurulmayan kalan sıfırsa, program hesabı kapatır ve kirayıowneröğesine geri verir.
SettleLimitOrder
Emrin doldurulmayan kalanını değiştirmeden doldurulmuş çıktı tokenlerini sahibine gönderin. auto_withdraw görevlileri uzun süreli kısmi doldurmalar damla ödemek istediğinde kullanışlıdır.
Çağıran — emrin owner öğesi veya programın limit_order_admin öğesi (otomatik görevli döngüsü çalıştıran çevrimdışı operasyonel sıcak cüzdan). Görevlinin başka yetkilisi yoktur — kullanıcı fonlarını doldurulmuş çıktıyı emrin owner ATA’sına göndermek dışında hareket ettiremez.
Hesaplar
Etki
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64)kullanarak borçlu olunan kümülatif çıktıyı hesaplar.- Deltayı
output_token_accountöğesine aktarır. limit_order.settled_outputöğesini günceller.- Emri kapatmaz; kalan giriş karşısında hala açıktır.
CloseLimitOrder
Tamamen tüketilmiş emir hesabını kapatın. Kira kim imzalarsa imzasın her zaman limit_order.owner öğesine döner.
Çağıran — owner veya limit_order_admin.
Ön koşullar
- Emrin sıfır doldurulmayan kalanı var (
amount == total_amountdoldurulmuş ve kapatılmış veya sahibi daha önce emri sıfıra azaltmış ve kapatmayı unutmuş).
limit_orderöğesini kapatır; kiralimit_order.owneröğesine gönderilir.
CreateDynamicFeeConfig (yönetici)
u16 dizini altında yeniden kullanılabilir parametre seti oluşturun.
Argümanlar
Yaygın hatalar —
InvalidDynamicFeeConfigParams decay_period <= filter_period ise veya herhangi bir 0 değerli alan sınırların dışında ise.
UpdateDynamicFeeConfig (yönetici)
Mevcut DynamicFeeConfig öğesini değiştirin. Oluşturma zamanında yapılandırmayı zaten anlık görüntü alan havuzlar geriye dönük olarak güncellenmez; yalnızca bu yapılandırmaya başvuran yeni oluşturulan havuzlar yeni değerleri alacaktır.
Argümanlar — CreateDynamicFeeConfig ile aynı beş kalibrasyon alanı (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator); index oluşturma zamanında sabitlenir ve burada yeniden geçilmez.
CollectProtocolFee / CollectFundFee
CPMM’nin CollectProtocolFee / CollectFundFee öğesi ile aynı şekil. İmzalayan AmmConfig.owner / AmmConfig.fund_owner öğesi ile eşleşmelidir. Havuzun kasalarından tahakkuk eden protokol/fon ücretlerini alıcıya taşıyın; ilgili PoolState.protocol_fees_* / fund_fees_* alanlarını sıfırlayın.
InitializeReward
Havuza yeni bir ödül akışı ekleyin. Aynı anda en fazla 3 akış etkin olabilir.
Argümanlar
Ön koşullar
- Havuzda şu anda 3’ten az akış etkin.
- Fon sağlayıcı bu talimatın bir parçası olarak
total_emission = emissions_per_second × (end_time − open_time)değerinde ödül tokenini kasaya yatırır. operation_statebaşına beyaz listeye alınan ödül mint’i.
SetRewardParams
Mevcut bir ödül akışını uzatın, doldurabilir veya emisyon oranını değiştirin. Tipik olarak havuz oluşturucu veya Raydium multisig tarafından çağrılır. Kısıtlamalar zincir üzerinde yaşar: genellikle end_time öğesini uzatabilir veya emisyonları artırabilir, geriye dönük olarak küçültemezsiniz. operation_state öğesinin sahibi listesini kontrol edin.
UpdateRewardInfos
Saf muhasebe — reward_growth_global_x64 öğesini geçerli zamana kapatır; emissions_per_second × Δt / liquidity öğesini çarparak. Her likidite dokunuşu talimatı tarafından dahili olarak çağrılır. Harici aktörlerin (UI’ler, kranklar) bunu tetiklemek istediği için bağımsız talimat olarak açığa çıkarılır.
CollectReward
Pozisyon sahibi borçlu ödül tokenlerini talep eder.
Hesaplar
Etki
- Ödül büyümesini kapatır (ücretler ile aynı desen).
- Borçlu tutarı alıcı ATA’sına aktarır;
reward_amount_owed[i]öğesini sıfırlar.
Durum değişikliği matrisi
Sonraki adım
products/clmm/code-demos— çalıştırılabilir TypeScript örnekleri.products/clmm/fees— ücret ve ödül tahakkuku hakkında ayrıntılar.reference/error-codes— kapsamlı CLMM Anchor hata tablosu.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

