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 →
Bu sayfa, products/clmm/accounts (hesapların ne olduğu) ve products/clmm/math (matematiğin ne olduğu) sayfalarıyla birlikte kullanılır. Argümanlar ve hesap sıralaması için yetkili kaynaktır; belirli bayt düzenleri IDL’den alınır.

Talimat envanteri

Çoğu yalnızca-yönetici talimatı (CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition), programın sabit kodlanmış admin pubkey’i tarafından kısıtlanmıştır. Ödül akışı yönetici talimatları (TransferRewardOwner, CollectRemainingRewards) ise program yöneticisi değil, ödül fon sağlayıcısı tarafından kısıtlanmıştır. V2 son eki “vault’larda / NFT’de Token-2022’yi destekler, bitmap genişletme yuvası gerektirir” anlamına gelir. SDK, yeni havuzlar için varsayılan olarak V2’yi seçer.

CreatePool

Argümanlar
Hesaplar (özet) Ön koşullar
  • Bayt sırasına göre token_mint_0 < token_mint_1.
  • amm_config.disable_create_pool == false.
  • Mint’ler Token-2022 uzantı izin listesi tarafından reddedilmemiş olmalıdır.
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ırlanmış (dinamik ücret devre dışı).

CreateCustomizablePool

Yeni havuzlar için önerilir. CreatePool ile aynı etkiyi sağlar; ek olarak havuz başına ücret toplama modu ve isteğe bağlı dinamik ücret katılım seçeneği sunar. Argümanlar
Hesaplar (özet)CreatePool ile aynı; enable_dynamic_fee = true olduğunda ek olarak: Ö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ştirildiyse: pool_state.dynamic_fee_info, sağlanan DynamicFeeConfig’den 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şturulurken ayarlanır. Yerinde yükseltme mevcut değildir — eski CreatePool aracılığıyla oluşturulan havuzlar geriye dönük olarak dinamik ücret veya tek taraflı ücret kazanamaz. Yeni dağıtımlar bu talimatı varsayılan olarak kullanmalıdır.

OpenPositionV2 / OpenPositionWithToken22Nft

Mevcut bir havuz içinde yeni bir pozisyon oluşturur. Argümanlar
Hesaplar (özet) Matematik — bkz. products/clmm/math. base_flag’e göre program, liquidity’yi veya (amount_0_max, amount_1_max)’ı gerçek L’ye ve tüketilen gerçek token miktarlarına dönüştürür. Ön koşullar
  • tick_lower < tick_upper, her ikisi de pool.tick_spacing’in katları olmalı ve [MIN_TICK, MAX_TICK] aralığında olmalıdır.
  • Gerekli tick dizileri iletilmiş ve başlatılmış olmalıdır (veya işlem içinde InitTickArray CPI aracılığıyla burada oluşturulmuş olmalıdır).
  • Kullanıcı, kaynak ATA’larında en az amount_0_max ve amount_1_max kadar token bulundurmalıdır.
Son koşullar
  • personal_position mevcut, liquidity ayarlı, fee_growth_inside_last anlık görüntü alınmış.
  • tick_lower ve tick_upper’daki tick-array girişleri güncellendi (liquidity_gross += L, liquidity_net ± L, ücret büyüme anlık görüntüleri korunuyor).
  • Pozisyon aralık içindeyse (tick_lower ≤ tick_current < tick_upper) pool_state.liquidity += L.
Yaygın hatalarInvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (çok fazla tick dizisi varsa).

IncreaseLiquidityV2

Halihazırda açık bir pozisyona likidite ekler. Argümanlar
HesaplarOpenPosition gibi, NFT mint’i olmadan (pozisyon zaten mevcut; NFT, 1 token tutan sahibin ATA’sı olarak iletilir). Etki
  • amount_0_actual / amount_1_actual’ı kullanıcıdan vault’lara aktarır.
  • personal_position.liquidity ve pool_state.liquidity’yi (aralık içindeyse) ve buna göre uç nokta tick liquidity_gross / liquidity_net’i artırır.
  • Son dokunuştan bu yana biriken ücret ve ödülleri dengeler ve bunları tokens_fees_owed_{0,1} / reward_amount_owed’a yazar. Bunlar yalnızca DecreaseLiquidity veya CollectReward’da ödenir, artırmada değil.

DecreaseLiquidityV2

Bir pozisyondan likidite kaldırır. Argümanlar
HesaplarIncreaseLiquidity ile aynı yapı. Etki
  • Mevcut sqrt_price_x64’e göre kaldırılan L için (amount_0, amount_1)’i hesaplar.
  • Son dokunuştan bu yana biriken ücret/ödülleri IncreaseLiquidity ile aynı şekilde dengeler.
  • amount_0 + fees_owed_0 ve amount_1 + fees_owed_1’i vault’lardan kullanıcıya aktarır.
  • Likidite sayaçlarını azaltır; yeni personal_position.liquidity == 0 ise pozisyon ClosePosition için uygun hale gelir.
Slippageamount_0_min ve amount_1_min, kullanıcının çıkış tarafındaki Token-2022 transfer ücretleri net olarak kabul edeceği minimum miktarlardır.

ClosePosition

Pozisyon NFT’sini yakar ve PersonalPositionState’i kapatı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 önce her şeyi toplayın ve sıfıra kadar azaltın.) Etki
  • NFT’yi yakar.
  • NFT mint hesabını ve personal_position hesabını kapatır, kira bedelini payer’a iade eder.

SwapV2

Likidite eğrisini dolaşır; is_base_input’a bağlı olarak tam girdi veya tam çıktı. Argümanlar
Hesaplar (özet) Çağıranlar, beklenen swap yürüyüşünü kapsayan sıralı bir tick dizisi listesi iletir; program ihtiyaç duyduğu kadarını kullanır. SDK bu listeyi PoolUtils.computeAmountOutFormat veya API’nin fiyat teklifi uç noktası aracılığıyla hesaplar. Ön koşullar
  • pool_state.status swap’a izin veriyor olmalıdır.
  • now >= open_time.
  • sqrt_price_limit_x64, yön için sqrt_price_x64’ün doğru tarafında olmalıdır.
Yaygın hatalarExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient. Çağıranların bilmesi gereken SwapV2’nin dahili işlemleri (2025 sonrası sürüm):
  1. Dinamik ücret ek bedelipool.dynamic_fee_info sıfır değilse, program son swap’tan bu yana kat edilen tick mesafesini kullanarak volatilite akümülatörünü günceller (products/clmm/fees içindeki filtre/bozunma kurallarıyla) ve AmmConfig.trade_fee_rate’in üzerine bir dynamic_fee_component ekler. Toplam ücret %10 ile sınırlıdır (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. Limit emir eşleştirme — fiyat yürüyüşü açık limit emirleri barındıran bir tick’i geçtiğinde, program önce o tick’teki mevcut limit emri likiditesini (order_phase’e göre FIFO) doldurur, ardından LP likidite eğrisi boyunca devam eder. Doldurulan miktarlar, sonraki uzlaşma için tick.unfilled_ratio_x64 ve tick.part_filled_orders_remaining’i günceller; emirlerin kendisi, sahibi SettleLimitOrder’ı çağırana kadar harcanmamış kalır.
  3. Tek taraflı ücret yönlendirmesipool.fee_on = Token0Only veya Token1Only olduğunda, swap adımı aynı girdi-çıktı ticaretini hesaplar; ücret daha sonra yapılandırılmış tarafa yönlendirilir. Yapılandırılmış ücret tarafının çıktı olduğu yönler için ücret, swap çıktısından düşülür (kullanıcı çıktı − ücret alır); girdi olduğu yönler için davranış FromInput ile eşleşir. PoolState üzerindeki is_fee_on_input(zero_for_one) ve is_fee_on_token0(zero_for_one) yöntemlerine bakın.
Swap (V1), SwapV2 ile aynı dinamik ücret, tek taraflı ücret yönlendirmesi ve limit emir eşleştirmeyi uygular; tek eksik özelliği Token-2022 desteğidir — her iki vault da klasik SPL Token olmalıdır. Herhangi bir Token-2022 mint’i olan havuzlar SwapV2 aracılığıyla swap yapılmalıdır. Toplayıcı ve SDK, her CLMM bacağı için zaten V2’yi tercih ettiğinden çağıranların mint türüne göre dallanması gerekmez.

OpenLimitOrder

Belirli bir tick’te satış emri verir. Emir, tick başına FIFO kohortunda oturur ve fiyat geçtikçe dolduruluir. Argümanlar
Hesaplar (özet) Ön koşullar
  • tick_index % pool.tick_spacing == 0 ve [MIN_TICK, MAX_TICK] aralığında olmalıdır.
  • tick_index, seçilen yön için pool.tick_current’ın doğru tarafında olmalıdır (token0 satışı → tick mevcut tick’in üzerinde olmalı, tersi de geçerli). Zaten geçilmiş bir tick’te satış yapmak anında eşleşmeye yol açacağından reddedilir.
  • pool_state.status, limit emir işlemine izin veriyor olmalıdır (bit 5).
Son koşullar
  • limit_order mevcut, açılış zamanında tick.order_phase ve tick.unfilled_ratio_x64’ün anlık görüntüsünü alıyor.
  • tick.orders_amount += amount (mevcut kohortta).
  • limit_order_nonce.order_nonce += 1.
  • OpenLimitOrderEvent yayımlandı.
Yaygın hatalarInvalidLimitOrderAmount (sıfır veya havuzun minimumunun altında), InvalidTickIndex ([MIN_TICK, MAX_TICK] dışında veya seçilen yön için tick_current’ın yanlış tarafında), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.

IncreaseLimitOrder

Mevcut açık bir emre ekleme yapar. Yalnızca emrin owner’ı tarafından çağrılabilir. Argümanlar
Hesaplar — nonce hesabı olmadan OpenLimitOrder gibi; limit_order PDA’sı doğrudan iletilir. Ön koşullar
  • limit_order.owner == signer.
  • Emir hâlâ aynı kohortta (tick.order_phase == limit_order.order_phase). Kohort doldurmaya başlamışsa, emir kısmen uzlaşılmıştır — çağıran önce ilerlemek için DecreaseLimitOrder veya SettleLimitOrder’ı çağırmalıdır.
Etki
  • amount’ı sahip ATA’sından input_vault’a aktarır.
  • limit_order.total_amount += amount; tick.orders_amount += amount.

DecreaseLimitOrder

Açık bir emri azaltır veya tamamen iptal eder. Doldurulmamış kalanı sahibe iade eder; geçmiş kısmi dolgularla önceden uzlaşılmış çıktıları da öder. Argümanlar
Hesaplar — hem girdi hem de çıktı token tarafları: Etki
  • Açılıştan bu yana kohortun unfilled_ratio_x64’ünden emrin doldurulan miktarını yeniden hesaplar.
  • Doldurulan çıktıyı output_token_account’a gönderir.
  • Doldurulmamış girdiden amount kadarını input_token_account’a geri gönderir.
  • limit_order’ı buna göre günceller. Yeni doldurulmamış kalan sıfırsa, program hesabı kapatır ve kira bedelini owner’a iade eder.

SettleLimitOrder

Doldurulan çıktı tokenlarını, emrin doldurulmamış kalanını değiştirmeden sahibe gönderir. auto_withdraw tutucularının uzun süreli kısmi dolguları damlatarak ödemek istediğinde kullanışlıdır. Çağıran — emrin owner’ı veya programın limit_order_admin’i (otomatik tutucu döngüsü çalıştıran, çevrimdışı bir operasyonel sıcak cüzdan). Tutucunun başka yetkisi yoktur — kullanıcı fonlarını yalnızca doldurulan çıktıyı emrin owner ATA’sına itmek dışında hareket ettiremez. Hesaplar Etki
  • (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64) kullanılarak borçlu birikimli çıktıyı hesaplar.
  • Deltayı output_token_account’a aktarır.
  • limit_order.settled_output’u günceller.
  • Emri kapatmaz; kalan girdi için hâlâ açıktır.

CloseLimitOrder

Tamamen tüketilmiş bir emir hesabını kapatır. Kira bedeli, imzalayanından bağımsız olarak her zaman limit_order.owner’a iade edilir. Çağıranowner veya limit_order_admin. Ön koşullar
  • Emrin doldurulmamış kalanı sıfırdır (ya amount == total_amount dolduruldu ve uzlaşıldı, ya da sahip daha önce emri sıfıra düşürüp kapatmayı unuttu).
Etki
  • limit_order’ı kapatır; kira bedeli limit_order.owner’a gönderilir.

CreateDynamicFeeConfig (yönetici)

Bir u16 indeksi altında yeniden kullanılabilir parametre seti oluşturur. Argümanlar
Hesaplar Yaygın hatalardecay_period <= filter_period ise veya herhangi bir sınır dışı 0 değerli alan varsa InvalidDynamicFeeConfigParams.

UpdateDynamicFeeConfig (yönetici)

Mevcut bir DynamicFeeConfig’i değiştirir. Oluşturma zamanında yapılandırmayı anlık görüntü almış havuzlar geriye dönük olarak güncellenmez; yalnızca bu yapılandırmaya başvuran yeni oluşturulan havuzlar yeni değerleri alı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 iletilmez.

CollectProtocolFee / CollectFundFee

CPMM’nin CollectProtocolFee / CollectFundFee’siyle özdeş yapı. İmzalayan AmmConfig.owner / AmmConfig.fund_owner ile eşleşmelidir. Havuzun vault’larından alıcıya birikmiş protokol/fon ücretlerini süpürür, ilgili PoolState.protocol_fees_* / fund_fees_* alanlarını sıfırlar.

InitializeReward

Bir havuza yeni bir ödül akışı ekler. Aynı anda en fazla 3 akış aktif olabilir. Argümanlar
Hesaplar Ön koşullar
  • Havuzda şu anda 3’ten az aktif akış var.
  • Fon sağlayıcı, bu talimatın bir parçası olarak vault’a total_emission = emissions_per_second × (end_time − open_time) değerinde ödül tokeni yatırır.
  • operation_state uyarınca beyaz listedeki ödül mint’i.

SetRewardParams

Mevcut bir ödül akışını uzatır, doldurur veya emisyon oranını değiştirir. Genellikle bir havuz oluşturucu veya Raydium çoklu imzası tarafından çağrılır. Kısıtlamalar zincir üzerindedir: genellikle end_time’ı uzatabilir veya emisyonları artırabilirsiniz, geriye dönük olarak azaltamazsınız. operation_state’in sahip listesini kontrol edin.

UpdateRewardInfos

Saf muhasebe — reward_growth_global_x64’ü emissions_per_second × Δt / liquidity çarparak şimdiki zamana dengeler. Her likiditeye dokunan talimat tarafından dahili olarak çağrılır. Harici aktörlerin (kullanıcı arayüzleri, krank’lar) bazen tetiklemek istediği için bağımsız bir talimat olarak sunulur.

CollectReward

Pozisyon sahibi borçlu ödül tokenlarını talep eder. Hesaplar Etki
  • Ödül büyümesini dengeler (ücretlerle aynı model).
  • Borçlu miktarı alıcı ATA’sına aktarır, reward_amount_owed[i]’yi sıfırlar.

Durum değişikliği matrisi

Sonraki adımlar

Kaynaklar: