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
Ö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.
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ı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
CreatePool ile aynı; enable_dynamic_fee = true olduğunda ek olarak:
Ön koşullar —
CreatePool ile aynı. enable_dynamic_fee = false ise dynamic_fee_config yoksayılır.
Son koşullar
pool_state.fee_on, seçilenCollectFeeOnvaryantına ayarlanır.- Dinamik ücret etkinleştirildiyse:
pool_state.dynamic_fee_info, sağlananDynamicFeeConfig’den 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ş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
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 depool.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
InitTickArrayCPI aracılığıyla burada oluşturulmuş olmalıdır). - Kullanıcı, kaynak ATA’larında en az
amount_0_maxveamount_1_maxkadar token bulundurmalıdır.
personal_positionmevcut,liquidityayarlı,fee_growth_inside_lastanlık görüntü alınmış.tick_lowervetick_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.
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (çok fazla tick dizisi varsa).
IncreaseLiquidityV2
Halihazırda açık bir pozisyona likidite ekler.
Argümanlar
OpenPosition 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.liquidityvepool_state.liquidity’yi (aralık içindeyse) ve buna göre uç nokta tickliquidity_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ızcaDecreaseLiquidityveyaCollectReward’da ödenir, artırmada değil.
DecreaseLiquidityV2
Bir pozisyondan likidite kaldırır.
Argümanlar
IncreaseLiquidity ile aynı yapı.
Etki
- Mevcut
sqrt_price_x64’e göre kaldırılanLiçin(amount_0, amount_1)’i hesaplar. - Son dokunuştan bu yana biriken ücret/ödülleri
IncreaseLiquidityile aynı şekilde dengeler. amount_0 + fees_owed_0veamount_1 + fees_owed_1’i vault’lardan 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 çı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.
- NFT’yi yakar.
- NFT mint hesabını ve
personal_positionhesabını kapatır, kira bedelinipayer’a iade eder.
SwapV2
Likidite eğrisini dolaşır; is_base_input’a bağlı olarak tam girdi veya tam çıktı.
Argümanlar
Ç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.statusswap’a izin veriyor olmalıdır.now >= open_time.sqrt_price_limit_x64, yön içinsqrt_price_x64’ün doğru tarafında olmalıdır.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
Çağıranların bilmesi gereken SwapV2’nin dahili işlemleri (2025 sonrası sürüm):
- Dinamik ücret ek bedeli —
pool.dynamic_fee_infosı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/feesiçindeki filtre/bozunma kurallarıyla) veAmmConfig.trade_fee_rate’in üzerine birdynamic_fee_componentekler. Toplam ücret %10 ile sınırlıdır (MAX_FEE_RATE_NUMERATOR / 1_000_000). - 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çintick.unfilled_ratio_x64vetick.part_filled_orders_remaining’i günceller; emirlerin kendisi, sahibiSettleLimitOrder’ı çağırana kadar harcanmamış kalır. - Tek taraflı ücret yönlendirmesi —
pool.fee_on = Token0OnlyveyaToken1Onlyolduğ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ı − ücretalır); girdi olduğu yönler için davranışFromInputile eşleşir.PoolStateüzerindekiis_fee_on_input(zero_for_one)veis_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
Ön koşullar
tick_index % pool.tick_spacing == 0ve[MIN_TICK, MAX_TICK]aralığında olmalıdır.tick_index, seçilen yön içinpool.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).
limit_ordermevcut, açılış zamanındatick.order_phasevetick.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.OpenLimitOrderEventyayımlandı.
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’ı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
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çinDecreaseLimitOrderveyaSettleLimitOrder’ı çağırmalıdır.
amount’ı sahip ATA’sındaninput_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
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
amountkadarı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 bedeliniowner’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ğıran — owner veya limit_order_admin.
Ön koşullar
- Emrin doldurulmamış kalanı sıfırdır (ya
amount == total_amountdolduruldu ve uzlaşıldı, ya da sahip daha önce emri sıfıra düşürüp kapatmayı unuttu).
limit_order’ı kapatır; kira bedelilimit_order.owner’a gönderilir.
CreateDynamicFeeConfig (yönetici)
Bir u16 indeksi altında yeniden kullanılabilir parametre seti oluşturur.
Argümanlar
Yaygın hatalar —
decay_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ü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 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
Ö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_stateuyarı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
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— eksiksiz CLMM Anchor hata tablosu.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

