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 →
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
Hesaplar (kısaltılmış) Ön koşullar
  • token_mint_0 < token_mint_1 bayt sırasına göre.
  • amm_config.disable_create_pool == false.
  • Mint’ler Token-2022 uzantısı izin listesi tarafından reddedilmez.
Son koşullar
  • 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_info sı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
Hesaplar (kısaltılmış)CreatePool ile aynı artı, enable_dynamic_fee = true olduğunda: Ön koşullarCreatePool ile aynı. enable_dynamic_fee = false ise, dynamic_fee_config yoksayılır. Son koşullar
  • pool_state.fee_on seçilen CollectFeeOn varyantına ayarlanır.
  • Dinamik ücret etkinleştirilirse: pool_state.dynamic_fee_info sağlanan DynamicFeeConfig öğesinden başlatılır (beş kalibrasyon parametresi kopyalanır; durum alanları sıfırlanır).
  • Aksi takdirde: pool_state.dynamic_fee_info sı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
Hesaplar (kısaltılmış)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. 0 değerindeki seed_index eski 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.
  • payer için permission PDA’sı var (yönetici tarafından CreatePermissionPda aracılığıyla oluşturulmuş).
  • CreatePool ile aynı mint / izin listesi kuralları.
Son koşullar
  • Yeni bir pool_state seed_index türetilmiş adresinde var; pool_state.seed_index = seed_index.
  • Diğer tüm son durum CreateCustomizablePool ile 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
Hesaplar (kısaltılmış) Matematikproducts/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 de pool.tick_spacing katları, [MIN_TICK, MAX_TICK] içinde.
  • Gerekli tick dizileri geçilir ve başlatılır (veya işlemde InitTickArray CPI aracılığıyla burada oluşturulur).
  • Kullanıcı kaynak ATA’larında en az amount_0_max ve amount_1_max öğesine sahiptir.
Son koşullar
  • personal_position var, liquidity ayarlanmış, fee_growth_inside_last anlık görüntüsü alınmış.
  • Tick dizisi girdileri tick_lower ve tick_upper öğelerinde güncellenir (liquidity_gross += L, liquidity_net ± L, ücret büyümesi anlık görüntüleri korunur).
  • pool_state.liquidity += L pozisyon 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 OpenPositionV2 veya OpenPositionWithToken22Nft ve 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. OpenPosition V1 dondurmaz.
Yaygın hatalarInvalidTickIndex, 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
HesaplarOpenPosition 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.liquidity ve pool_state.liquidity (aralıkta ise) ve uç nokta tick’i liquidity_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ızca DecreaseLiquidity veya CollectReward öğesinde ödenir, artışta değil.

DecreaseLiquidityV2

Bir pozisyondan likiditeyi kaldırın. Argümanlar
HesaplarIncreaseLiquidity ile aynı şekil. Etki
  • Geçerli sqrt_price_x64 verilen kaldırılan L için (amount_0, amount_1) öğesini hesaplar.
  • Son dokunuştan bu yana tahakkuk eden ücretleri/ödülleri kapatır; IncreaseLiquidity ile aynı.
  • amount_0 + fees_owed_0 ve amount_1 + fees_owed_1 öğesini kasalardan kullanıcıya aktarır.
  • Likidite sayaçlarını azaltır; yeni personal_position.liquidity == 0 ise, pozisyon ClosePosition için uygun hale gelir.
Kaymaamount_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 bunu PoolState olarak yükler ve çözmek için PDA seed’lerini kullanır.
Ön koşullar
  • personal_position.liquidity == 0.
  • tokens_fees_owed_{0,1} == 0.
  • Tüm ödül sayaçları reward_amount_owed == 0.
(Yani, her şeyi toplayın ve önce sıfıra azaltın.) Etki
  • 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.
Çözme, yakma ve kapatma atomiktir. NFT bu adımlar arasında aktarılabilir hale gelemez. Koşullu istemci kırılması — bildirilen IDL düzeni değişmez, bu nedenle eski istemciler mevcut ve donmuş olmayan pozisyonları kapatmaya devam eder. Havuz kalan hesabını atlayan eski bir oluşturucu donmuş bir pozisyonu kapatırken 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
Hesaplar (kısaltılmış) 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.status swapa izin verir.
  • now >= open_time.
  • sqrt_price_limit_x64 yön için sqrt_price_x64 öğesinin doğru tarafında.
Yaygın hatalarExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient. SwapV2 öğesinin arayanların bilmesi gereken dahili olarak yaptığı şey (2025 sonrası sürüm):
  1. Dinamik ücret ek ücretipool.dynamic_fee_info sı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) ve AmmConfig.trade_fee_rate öğesinin üzerine dynamic_fee_component ekler. Toplam ücret %10 ile sınırlandırılır (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. 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ş tutarlar tick.unfilled_ratio_x64 ve tick.part_filled_orders_remaining öğesini daha sonraki kapatma için günceller; emirler kendileri sahibi SettleLimitOrder çağırana kadar harcı olmaz.
  3. Tek taraflı ücret yönlendirmesipool.fee_on = Token0Only veya Token1Only olduğ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 − fee alır); yapılandırılan tarafın giriş olduğu yönler için davranış FromInput ile eşleşir. PoolState öğesinde is_fee_on_input(zero_for_one) ve is_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
Hesaplar (kısaltılmış)
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.
Ön koşullar
  • Ne input_token_account ne de output_token_account donmuş değildir (aksi takdirde NotApproved).
  • pool_state.status hem swap (bit 4) hem de limit emri (bit 5) işlemlerine izin verir (aksi takdirde NotApproved).
  • tick_index % pool.tick_spacing == 0 ve [MIN_TICK, MAX_TICK] içinde.
  • tick_index seçilen yön için pool.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.
Son koşullar
  • limit_order var; açılış zamanında tick.order_phase ve tick.unfilled_ratio_x64 anlık görüntüsü alınmış.
  • tick.orders_amount += amount (geçerli kohortunda).
  • limit_order_nonce.order_nonce += 1.
  • OpenLimitOrderEvent yayınlandı.
Yaygın hatalarNotApproved (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
HesaplarOpenLimitOrder 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 önce DecreaseLimitOrder veya SettleLimitOrder çağırmalıdır.
Etki
  • amount öğesini sahibi ATA’sından input_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
Hesaplar — hem giriş hem de çıkış token tarafları: 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.
  • amount doldurulmayan girişi input_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ğıranowner veya limit_order_admin. Ön koşullar
  • Emrin sıfır doldurulmayan kalanı var (amount == total_amount doldurulmuş ve kapatılmış veya sahibi daha önce emri sıfıra azaltmış ve kapatmayı unutmuş).
Etki
  • limit_order öğesini kapatır; kira limit_order.owner öğesine gönderilir.

CreateDynamicFeeConfig (yönetici)

u16 dizini altında yeniden kullanılabilir parametre seti oluşturun. Argümanlar
Hesaplar Yaygın hatalarInvalidDynamicFeeConfigParams 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ümanlarCreateDynamicFeeConfig 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
Hesaplar Ö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_state başı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

Kaynaklar: