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 çalışır. Argümanlar ve hesap sıralaması için yetkilidir; belirli bayt düzenleri IDL’den gelir.2026-09 program yükseltmesi CLMM’yi Anchor 1.0.2 / Solana 3.1.10 üzerine yeniden inşa etti, admin talimatı CollectExcessLamports ekledi ve CreateAmmConfig’in owner / fund_owner içine yazdığı şeyi değiştirdi. Hiçbir kullanıcı tarafından kullanılan talimat hesaplarını, argümanlarını veya matematiklerini değiştirmedi. 2026-09-30 changelog girişine bakın.2026-10-22 program yükseltmesi CreatePermissionedPool’u CreateCustomizablePoolV2 olarak yeniden adlandırır, herkes tarafından çağrılabilir hale getirir ve iki admin talimatı ile Permission hesabını kaldırır. 2026-10-22 changelog girişine bakın.

Talimat envanteri

Tick dizisi başlatma talimatı yoktur ve buna gerek yoktur. Tick dizisi içinde oluşturulur OpenPosition* / IncreaseLiquidity* tarafından TickArrayState::get_or_create_tick_array aracılığıyla, payer tarafından ödenir. (Muhtemelen hala başlatılmamış, sistem tarafından sahip olunan) tick dizisi PDA’sını tick_array_lower / tick_array_upper olarak geçirin ve program eksikse onu tahsis eder. OpenLimitOrder tek tick_array’i için aynı şeyi yapar.
Çoğu admin tarafından yapılan talimat (CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) program’ın sabit kodlanmış admin genel anahtarı tarafından kapılanır. CreateSupportMintAssociated / CloseSupportMintAssociated admin genel anahtarını veya özel bir destek-mint sahibi anahtarını kabul eder; CollectExcessLamports admin genel anahtarını veya özel bir lamport toplama cüzdanını kabul eder. Ödül akışı admin talimatları (TransferRewardOwner, CollectRemainingRewards) program admini tarafından değil, ödül fon sağlayıcısı tarafından kapılanır. V2 soneki “Token-2022’yi kasalar / NFT’de destekler, bitmap-uzantı slotu gerektirir” anlamına gelir. SDK yeni havuzlar için varsayılan olarak V2’yi seçer.

CreatePool

Argümanlar
Hesaplar (kısaltılmış)
Slotlar 10 ve 11 mint başına, “SPL Token sonra Token-2022” değildir. Her biri eşleşen mint’teki mint::token_program tarafından kısıtlanır, bu nedenle token_mint_0’ı Token-2022 ve token_mint_1’i klasik SPL olan bir havuz için slot 10’a Token-2022 ve slot 11’e SPL Token geçirmelisiniz. CreateCustomizablePool ve CreateCustomizablePoolV2 aynı iki slotu kullanır.
Ön koşullar
  • token_mint_0 < token_mint_1 bayt sırasına göre.
  • amm_config.disable_create_pool == false.
  • Mintler Token-2022 uzantı 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ı. Argümanlar
Hesaplar — CreatePool’un tam olarak 13 beyan edilen hesabı. dynamic_fee_config beyan edilen bir hesap değildir.
enable_dynamic_fee = true olduğunda, anlık görüntü alınacak DynamicFeeConfig son remaining_account olarak sağlanmalıdır — işleyici ctx.remaining_accounts.last() okur. Herhangi bir SupportMintAssociated bypass PDA’sı bu nedenle önce gelmelidir, aksi takdirde program yanlış hesabın anlık görüntüsünü alır ve deserialization başarısız olur. Bayrak ayarlanmışken onu atlama AccountLack ile başarısız olur.
Ön koşullar — CreatePool ile aynı. enable_dynamic_fee = false ise, remaining_account gerekli değildir ve geçirilen herhangi biri yalnızca destek-mint kayıtları için taranı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’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ş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.

CreateCustomizablePoolV2

Hem CreatePool hem de CreateCustomizablePool, pool PDA’sını ["pool", amm_config, token_mint_0, token_mint_1] adresinden türetir; bu nedenle her (config, mint0, mint1) üçlüsü için tam olarak bir kanonik pool adresi vardır — aynı seed’lerle ikinci bir init başarısız olur. CreateCustomizablePoolV2 bu kısıtlamayı kaldırarak, istemci tarafından sağlanan seed_index: u16 değerini pool PDA seed’lerine katarak aynı çift ve ücret katmanı için birden fazla pool oluşturmaya izin verir — her biri kendi adresinde. Herkes bunu çağırabilir. Pool hakkındaki diğer her şey CreateCustomizablePool ile aynıdır: aynı CreateCustomizableParams parametrelerini alır ve tek taraflı ücret ile dinamik ücret seçeneğini destekler.
2026-10-22 yükseltmesine kadar bu talimat CreatePermissionedPool olarak adlandırılıyordu ve ödeyicinin yönetici tarafından verilen bir Permission PDA’sına sahip olmasını gerektiriyordu. Yükseltme adını değiştirdi, permission hesabını kaldırdı ve izin mekanizmasını sildi. Ayırıcı adla birlikte değişti, bu nedenle CreatePermissionedPool karşısında oluşturulan istemcilerin yeniden oluşturulması gerekir.
Argümanlar
Hesaplar remaining_accounts: Token-2022 mint’i gerektiğinde destek-mint kayıt defteri PDA’ları ve enable_dynamic_fee = true olduğunda DynamicFeeConfig son — CreateCustomizablePool’da olduğu gibi. Ön Koşullar
  • seed_index != 0. seed_index değeri 0 eski pool’lar için ayrılmıştır ve burada reddedilir; [0, 0] seed bileşeni, eski bir pool adresinin klasik dört seed formuna çökmesini sağlayan şeydir.
  • Türetilen adresinde henüz pool yok.
  • CreatePool ile aynı mint / izin listesi kuralları.
Son Koşullar
  • Yeni bir pool_state, seed_index-türetilmiş adresinde pool_state.seed_index = seed_index ile var.
  • Diğer tüm son durumlar CreateCustomizablePool ile eşleşir (ücret modu, isteğe bağlı dinamik ücret).
pool_creator kontrol edilmediğinden, herhangi bir ödeyici pool_state.owner’a herhangi bir adres yazabilir. Bu adres pool’da InitializeReward’ı çağırabilir, ancak bu pool’u kimin oluşturduğunun kanıtı değildir. Entegratörler V2 pool’larını owner değerine göre etiketlemeli veya sıralamaktan kaçınmalıdır.

OpenPositionV2 / OpenPositionWithToken22Nft

Mevcut bir pool içinde yeni bir pozisyon oluşturun. Argümanlar
Hesaplar — iki varyant farklı hesap listelerine sahiptir. OpenPositionV2 22 tane bildirir; OpenPositionWithToken22Nft 20 tane bildirir. OpenPositionV2, sırasıyla: OpenPositionWithToken22Nft, metadata_account (5) ve metadata_program (19) kaldırılmış aynı listedir — bunun yerine pozisyonun meta verilerini NFT mint’indeki Token-2022 meta veri uzantısı aracılığıyla yazar — 20 hesap verir. position_nft_mint’i basit bir Signer ve position_nft_account’ı bir UncheckedAccount’tır.
tick_array_bitmap_extension her iki varyant üzerinde de bildirilmiş bir hesap değildir. Pozisyonun aralığı pool’un satır içi tick_array_bitmap (±512 tick dizileri) dışına düştüğünde, TickArrayBitmapExtension PDA’sını ["pool_tick_array_bitmap_extension", pool_state] seed’lerinde remaining_accounts[0] olarak ekleyin.
Matematik — bkz. products/clmm/math. base_flag verildiğinde, program liquidity veya (amount_0_max, amount_1_max) değerlerini 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’in katları, [MIN_TICK, MAX_TICK] içinde.
  • İki tick-array PDA’sı geçirilir. Bunlar zaten var olmak zorunda değildir — get_or_create_tick_array eksik olanı bu talimat içinde payer’ın masrafına ayırır. Ayrı bir init-tick-array talimatı yoktur.
  • Kullanıcı kaynak ATA’larında en az amount_0_max ve amount_1_max tutarına sahiptir.
Son Koşullar
  • personal_position var, liquidity ayarlanmış, fee_growth_inside_last anlık görüntüsü alınmış.
  • tick_lower ve tick_upper adreslerindeki tick-array girdileri güncellendi (liquidity_gross += L, liquidity_net ± L, ücret-büyüme anlık görüntüleri korunmuş).
  • pool_state.liquidity += L eğer pozisyon aralık içindeyse (tick_lower ≤ tick_current < tick_upper).
  • Pozisyon NFT mint’i pool_state’i 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 vault mint’lerinden herhangi birinin dondurma yetkilisi CLMM’nin kısıtlı-yayıncı listesiyle eşleşmediği sürece dondurulmamış kalır. Yalnızca bu eşleşen V2 yolu hesabı dondurur. OpenPosition V1 dondurmaz.
Yaygın hatalar — TickInvalidOrder (tick_lower >= tick_upper), TickAndSpacingNotMatch (bir uç nokta tick_spacing’in katı değil), InvalidTickIndex ([MIN_TICK, MAX_TICK] dışında), MissingTickArrayBitmapExtensionAccount (aralık satır içi bitmap dışında ve uzantı eklenmedi), NotApproved (pool_state.status açmayı engeller), ZeroAmountSpecified.
Pozisyon dondurma, bildirilmiş talimat hesapları veya argümanları eklemez. İstemciler bu pozisyonları mevcut V2 düzenleriyle açabilir. Davranış zincir üzerinde vault_0_mint ve vault_1_mint adresinden seçilir.

IncreaseLiquidityV2

Zaten açık olan bir pozisyona likidite ekleyin. Argümanlar
Hesaplar — 15 tane ve OpenPosition adresinden türetilemez: rent yok, system_program yok, associated_token_program yok ve meta veri hesabı yok. Pozisyonun aralığı satır içi bitmap dışında olduğunda TickArrayBitmapExtension PDA’sını remaining_accounts[0] olarak başına ekleyin. Etki
  • amount_0_actual / amount_1_actual tutarını kullanıcıdan → vault’lara aktarır.
  • personal_position.liquidity ve pool_state.liquidity (aralık içindeyse) artırır ve uç nokta-tick liquidity_gross / liquidity_net değerlerini buna göre günceller.
  • Son dokunuştan bu yana ödenmesi gereken ücretleri ve ödülleri toplar ve bunları token_fees_owed_{0,1} / reward_amount_owed değerlerine yatırır. Bunlar yalnızca DecreaseLiquidity / DecreaseLiquidityV2 üzerinde ödenir, artış üzerinde değil — bağımsız bir toplama talimatı yoktur.

DecreaseLiquidityV2

Bir pozisyondan likidite kaldırın. Argümanlar
Hesaplar — 16 tane ve IncreaseLiquidityV2 ile aynı şekil veya sırada değil: personal_position ve pool_state değiştirilmiş, vault’lar tick dizilerinden önce gelir, kullanıcı tarafı hesapları recipient_token_account_* olarak adlandırılır ve ekstra bir memo_program vardır. Kalan hesaplar — toplanmakta olan her aktif ödül için üç tane, reward_token_vault(W), recipient_token_account(W), reward_vault_mint sırasında. Pozisyonun aralığı satır içi bitmap dışında olduğunda TickArrayBitmapExtension PDA’sını başına ekleyin.
Bu aynı zamanda tek ücret ve ödül toplama yoludur. Pozisyonu değiştirmeden toplamak için liquidity = 0, amount_0_min = 0, amount_1_min = 0 ile çağırın.
Etki
  • Kaldırılan L için geçerli sqrt_price_x64 verildiğinde (amount_0, amount_1) 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 tutarlarını 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.
Slippage — amount_0_min ve amount_1_min, kullanıcının çıkış tarafında Token-2022 transfer ücretleri net olarak kabul ettiği minimumlar.

ClosePosition

Position NFT’sini yakın ve PersonalPositionState’i kapat. Bildirilen hesaplar Kalan hesaplar
  • Donmamış NFT: hiçbiri gerekli değil; ekstra pool hesabı zararsızdır çünkü işleyici onu okumaz.
  • Donmuş NFT: personal_position.pool_id’yi ilk kalan hesap olarak ekleyin. Program bunu PoolState olarak yükler ve çözme işlemini imzalamak için PDA seed’lerini kullanır.
Ön koşullar
  • personal_position.liquidity == 0.
  • tokens_fees_owed_{0,1} == 0.
  • Tüm reward sayaçları reward_amount_owed == 0.
(Yani, önce her şeyi toplayın ve sıfıra düşürün.) Etki
  • NFT token hesabı donmuşsa, ilk kalan hesabın personal_position.pool_id’ye eşit olduğunu doğrular, ardından pool PDA’sı ile çözer.
  • NFT’yi yakar.
  • NFT token hesabını ve personal_position’ı kapatır, kirayı nft_owner’a geri öder. Position NFT Token-2022 kullanıyorsa, NFT mint’ini de kapatır; klasik SPL Token mint’leri kapatılamaz ve sıfır arz ile kalır.
Çözme, yakma ve kapatma atomiktir. NFT bu adımlar arasında aktarılabilir hale gelemez. Koşullu istemci uyumluluğu — bildirilen IDL düzeni değişmez, bu nedenle eski istemciler mevcut ve donmamış pozisyonları kapatmaya devam eder. Pool kalan hesabını atlayan eski bir oluşturucu, donmuş bir pozisyonu kapatırken AccountLack ile başarısız olur. Her kapatma için pool’u geçmek en basit uyumlu stratejidir.

SwapV2

Likidite eğrisini takip edin; is_base_input’e bağlı olarak tam giriş veya tam çıkış. Argümanlar
Hesaplar (özet) Çağıranlar, beklenen swap yürüyüşünü kapsayan sıralanmış bir tick dizi listesi geçerler; program ihtiyaç duyduğu kadarını kullanır. SDK bu listeyi PoolUtils.computeAmountOutFormat veya API’nin quote uç noktası aracılığıyla hesaplar. Ön koşullar
  • pool_state.status swap’a izin verir.
  • now >= open_time.
  • sqrt_price_limit_x64 yön için sqrt_price_x64’ün doğru tarafında.
Yaygın hatalar — TooLittleOutputReceived (tam giriş slippage), TooMuchInputPaid (tam çıkış slippage), SqrtPriceLimitOverflow, NotEnoughTickArrayAccount, InvalidFirstTickArrayAccount, MissingTickArrayBitmapExtensionAccount, LiquidityInsufficient, NotApproved (swap biti pool_state.status’ta ayarlanmış). CLMM’nin ExceededSlippage varyantı yoktur — bu ad CPMM’nindir — ve TickArrayNotFound yoktur. SwapV2’nin çağıranların bilmesi gereken dahili işlemleri (2025 sonrası sürüm):
  1. Dinamik ücret ek ücreti — pool.dynamic_fee_info sıfır değilse, program volatilite biriktiricisini son swap’tan bu yana geçilen tick mesafesi kullanarak günceller (ücret products/clmm/fees kurallarından filtre/bozunma ile) ve AmmConfig.trade_fee_rate’in üzerine bir 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 by order_phase), ardından LP likidite eğrisi boyunca devam eder. Doldurulmuş miktarlar tick.unfilled_ratio_x64 ve tick.part_filled_orders_remaining’i sonraki kapatma için günceller; emirler kendileri sahibi SettleLimitOrder’ı çağırana kadar harcı olmaz.
  3. Tek taraflı ücret yönlendirmesi — pool.fee_on = Token0Only veya Token1Only olduğunda, swap adımı yine de aynı giriş-çıkış ticaretini hesaplar; ücret daha sonra yapılandırılmış tarafa yönlendirilir. Yapılandırılmış ücret tarafının çıkış olduğu yönler için, ücret swap çıkışından düşülür (kullanıcı out − fee alır); giriş olduğu yönler için davranış FromInput ile eşleşir. PoolState’deki is_fee_on_input(zero_for_one) ve is_fee_on_token0(zero_for_one)’a bakın.
Swap (V1) SwapV2 ile aynı dinamik ücreti, tek taraflı ücret yönlendirmesini ve limit emri eşleştirmesini uygular; eksik olduğu tek özellik Token-2022 desteğidir — her iki vault da klasik SPL Token olmalı. Herhangi bir Token-2022 mint’i olan pool’lar SwapV2 aracılığıyla swap edilmelidir. Toplayıcı ve SDK zaten her CLMM bacağı için V2’yi tercih eder, bu nedenle çağıranların mint türüne göre dallanması gerekmez.

OpenLimitOrder

Belirli bir tick’te satış emri verin. Emir, tick başına FIFO kohortunda oturur ve fiyat geçtikçe doldurulur. Argümanlar
Hesaplar (özet) Kalan hesaplar — [0] tick_array_bitmap_extension, yalnızca başlangıç indeksi pool’un satır içi bitmap’inin dışına düşen bir tick dizisini başlatırken gerekli. Aksi takdirde hiçbir şey geçmeyin.
rent hesabı yoktur: yapı system_program’da biter, 13 bildirilen hesap. Konumda 14’te dolaşan bir rent, tam olarak isteğe bağlı bitmap uzantısının okunduğu yere iner, bu nedenle emir satır içi bitmap’inin dışında bir tick dizisinin ilk kez oluşturulması gerekene kadar çalışıyor gibi görünür — ve sonra başarısız olur.
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 tokenlar) 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ğil (aksi takdirde NotApproved).
  • pool_state.status hem swap (bit 4) hem de limit-order (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’ın sağ tarafında (token0 satışı → tick mevcut üzerinde olmalı, ve tersi). Zaten geçilmiş bir tick’te satış hemen eşleştirilir ve reddedilir.
Sonrası koşullar
  • limit_order var, açılış zamanında tick.order_phase ve tick.unfilled_ratio_x64’ü anlık görüntüler.
  • tick.orders_amount += amount (mevcut kohortda).
  • limit_order_nonce.order_nonce += 1.
  • OpenLimitOrderEvent yayınlanır.
Yaygın hatalar — NotApproved (giriş veya çıkış token hesabı donmuş, veya pool swap / limit-order devre dışı), ZeroAmountSpecified (giriş tarafı transfer ücreti sonrası amount == 0), InvalidLimitOrderAmount (miktar o tick’te 1 temel birim altında çıkış üretir veya u64 taşar), 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 emre ekleyin. Yalnızca emrin owner’ı tarafından çağrılabilir. Argümanlar
Hesaplar — 8, yalnızca giriş tarafı. Nonce hesabını, üç çıkış tarafı hesabını ve system_program’ı bırakır. Ö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ı.
Etki
  • amount’ı sahibinin ATA’sından input_vault’a aktarır.
  • limit_order.total_amount += amount; tick.orders_amount += amount.

DecreaseLimitOrder

Açık bir emri azaltın veya tamamen iptal edin. Doldurulmamış kalanı sahibine geri öder, artı geçmiş kısmi doldurmalarla zaten kapatılmış herhangi bir çıkış. Argümanlar
Hesaplar — hem giriş hem de çıkış token tarafları: Etki
  • Emrin doldurulmuş miktarını açılıştan bu yana kohortun unfilled_ratio_x64’ünden yeniden hesaplar.
  • Doldurulmuş çıkışı output_token_account’a gönderir.
  • amount doldurulmamış girişi 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 kirayı owner’a geri öder.

SettleLimitOrder

Doldurulmuş çıkış tokenlerini siparişin doldurulmamış kalanını değiştirmeden sahibine gönderin. auto_withdraw keeper’ları uzun süreli kısmi doldurmaları damla-ödeme yapmak istediğinde kullanışlıdır. Çağıran — siparişin owner’ı veya programın limit_order_admin’i (otomatik keeper döngüsü çalıştıran çevrimdışı operasyonel sıcak cüzdan). Keeper’ın başka yetkisi yoktur — kullanıcı fonlarını siparişin owner ATA’sına doldurulmuş çıkışı göndermek dışında hareket ettiremez. Hesaplar Etki
  • (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64) kullanarak borçlu olunan kümülatif çıkışı hesaplar.
  • Deltayı output_token_account’a aktarır.
  • limit_order.settled_output’u günceller.
  • Siparişi kapatmaz; kalan giriş karşısında hala açıktır.

CloseLimitOrder

Tamamen tüketilmiş bir sipariş hesabını kapatın. Kira, kim imzalarsa imzasın her zaman limit_order.owner’a iade edilir. Çağıran — owner veya limit_order_admin. Ön koşullar
  • Siparişin sıfır doldurulmamış kalanı vardır (ya amount == total_amount doldurulmuş ve kapatılmış, ya da sahip daha önce siparişi sıfıra düşürmüş ve kapatmayı unutmuş).
Etki
  • limit_order’ı kapatır; kira limit_order.owner’a gönderilir.

CreateDynamicFeeConfig (yönetici)

Bir u16 indeksi altında yeniden kullanılabilir bir parametre seti oluşturun. Argümanlar
Hesaplar Yaygın hatalar — decay_period <= filter_period ise veya herhangi bir 0 değerli alan sınırların dışındaysa InvalidDynamicFeeConfigParams.

UpdateDynamicFeeConfig (yönetici)

Mevcut bir DynamicFeeConfig’i değiştirin. Oluşturma zamanında yapılandırmayı zaten anlık görüntüsü 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 sırasında sabitlenir ve burada yeniden geçirilmez.

CollectProtocolFee / CollectFundFee

Havuzun kasalarından tahakkuk eden protokol/fon ücretlerini bir alıcıya taraklayın, karşılık gelen PoolState.protocol_fees_* / fund_fees_* alanlarını sıfırlayın. Bu CPMM’nin düzeni değildir — CLMM’nin authority hesabı yoktur ve alıcı alanları recipient_token_{0,1}_account yerine recipient_token_account_{0,1} olarak adlandırılır. Argümanlar — amount_0_requested: u64, amount_1_requested: u64.
2026-09’da değiştirildi: yeni yapılandırmalar artık ücret sahiplerini imzalayanlardan almaz. create_amm_config artık programın sabit kodlanmış protocol_fee_owner::ID’sini owner’a ve fund_fee_owner::ID’sini fund_owner’a yazar. Daha önce, yönetici imzalayanın anahtarını her ikisine de kopyalardı. Mainnet’te bunlar zaten mevcut 21 yapılandırmanın tümünde depolanan aynı anahtarlardır. Adresler reference/program-addresses içindedir.Yukarıdaki kabul edilen imzalayanlar değişmemiştir. Yönetici hala herhangi bir yapılandırmadan toplayabilir ve mevcut AmmConfig hesapları yeniden yazılmaz. Hesaptan owner / fund_owner’ı okuyun, her iki değeri de varsaymak yerine. UpdateAmmConfig parametreleri 3 ve 4 hala onları döndürür.

CollectExcessLamports

CLMM’nin kontrol ettiği hesaplardaki kira-muaf minimumun üzerindeki lamportların yönetici taraması. SIMD-0437 kira azaltması her adımdan önce oluşturulan hesaplarda bıraktığı aşırı finansmanı geri almak için 2026-09 yükseltmesinde eklendi. Yalnızca fazlalık hareket eder. Token bakiyeleri, hesap verileri, sahipleri, havuz durumu ve fiyat eğrisi dokunulmaz. Zaten minimumda olan bir hesap olduğu gibi bırakılır, bu nedenle her dağıtım adımından sonra talimat güvenle yeniden çalıştırılabilir. Argümanlar: hiçbiri. Hesaplar Kapsam: çağrı başına bir havuz. CLMM’nin program genelinde kasa yetkisi yoktur. Her havuzun kasaları kendi PoolState’i tarafından sahiplenilir. Bu nedenle her token-program kaynağının slot 2’de pool_state’i yetkili olarak olması gerekir: token_vault_0, token_vault_1 veya o havuzun ödül kasalarından biri. Başka bir havuzun kasasını veya bir kullanıcının token hesabını geçerseniz, token programının sahip kontrolü başarısız olur ve tüm talimat geri döner. Atlanmaz. Pozisyon NFT mintleri taranmaz, çünkü mint yetkisi pozisyon açıldığında iptal edilir. Her kaynak hesabın nasıl işlendiği Program remaining_accounts üzerinde iki geçiş yapar: önce her token-program CPI’sı, sonra doğrudan borçlar. İkisini araya sokmak çalışma zamanının UnbalancedInstruction hatasıyla iptal olur, bu nedenle sıra programda sabitlenir ve listeyi kendiniz sıralamanız gerekmez.
Geçiş 2, bir kullanıcının kirasını ödediği hesapları kapsar. Burada geçirilen bir PersonalPositionState veya LimitOrderState, diğer herhangi bir CLMM tarafından sahip olunan hesap gibi fazlalığından vazgeçer. Kira-muaf kalır ve verilerini tutar. Daha sonra kapatıldığında, sahip o noktada hesabın tuttuğu her şeyi geri alır; bu, bir tarama sonrasında geçerli kira minimumdur.
İşlem boyutu, bir çağrıya kaç kaynağın sığabileceğinin gerçek sınırıdır. Bu, solana-fundamentals/rent-and-reclaimable-rent içinde açıklanan cüzdan tarafı tarama ile aynı kısıtlamadır. Yaygın hatalar:
  • NotApproved (6000): yanlış imzalayan.
  • LamportsCalculateError (6052): wSOL gidiş-dönüş sıfıra net olmadı.
  • Bir token-program sahip-uyuşmazlığı hatası: bir token kaynağı pool_state tarafından sahip değildir.
  • InsufficientFunds: bir programa ait hesap kendi kira minimumundan daha az tutar.
SDK oluşturucu yok. @raydium-io/raydium-sdk-v2 bu yönetici yolu için bir oluşturucu göndermez. IDL’den elle kodlayın.

InitializeReward

Bir havuza yeni bir ödül akışı ekleyin. Aynı anda en fazla 3 akış etkin olabilir. Argümanlar — tek bir yapı, param: InitializeRewardParam:
Tel kodlaması üç alanın arka arkaya olmasıdır, bu nedenle elle oluşturulan bir talimat etkilenmez — ancak IDL tarafından yönlendirilen bir istemci üç konumsal argüman yerine bir param nesnesi geçmelidir. Hesaplar Ön koşullar
  • Havuzda 3’ten az akış şu anda etkindir.
  • Funder, 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ınmış ödül mint’i.

SetRewardParams

Mevcut bir ödül akışını genişletin, doldurabilir veya emisyon oranını değiştirin. Tipik olarak havuz yaratıcısı veya Raydium multisig tarafından çağrılır. Kısıtlamalar zincir üzerinde yaşar: genellikle end_time’ı genişletebilir veya emisyonları artırabilir, geriye dönük olarak küçültemezsiniz. operation_state’in sahip listesini kontrol edin.

UpdateRewardInfos

Saf muhasebe — reward_growth_global_x64’ü geçerli zamana emissions_per_second × Δt / liquidity çarparak kapatır. Likiditeye dokunan her talimat tarafından dahili olarak çağrılır. Dış aktörler (UI’lar, kranklar) bazen bunu tetiklemek istediğinden, bağımsız bir talimat olarak açığa çıkarılır.

Ödülleri toplama

Bağımsız bir ödül toplama talimatı yoktur. Program CollectReward giriş noktasını açığa çıkarmaz ve yayınlanan IDL’nin de hiçbiri yoktur.
Bir pozisyona borçlu olunan ödüller DecreaseLiquidity / DecreaseLiquidityV2 tarafından ödenir. Pozisyonu değiştirmeden toplamak için liquidity = 0, amount_0_min = 0, amount_1_min = 0 ile çağırın. Ödül kasaları ve alıcı hesapları remaining_accounts’a etkin ödül başına üçlü gruplar halinde, reward_token_vault(W), recipient_token_account(W), reward_vault_mint sırasında gider. CollectRemainingRewards farklı bir şeydir: ödül funder’ının, bir akışın end_time’ından sonra, herhangi bir pozisyona tahsis edilmemiş tokenları taramasına izin verir.

Durum değişim matrisi

Sonraki adımlar

Kaynaklar: