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.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
Ön koşullar
token_mint_0 < token_mint_1bayt sırasına göre.amm_config.disable_create_pool == false.- Mintler Token-2022 uzantı 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ı.
Argümanlar
CreatePool’un tam olarak 13 beyan edilen hesabı. dynamic_fee_config beyan edilen bir hesap değildir.
Ö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_onseçilenCollectFeeOnvaryantına ayarlanır.- Dinamik ücret etkinleştirilirse:
pool_state.dynamic_fee_infosağ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ş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.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_indexdeğeri0eski 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.
CreatePoolile aynı mint / izin listesi kuralları.
- Yeni bir
pool_state,seed_index-türetilmiş adresindepool_state.seed_index = seed_indexile var. - Diğer tüm son durumlar
CreateCustomizablePoolile eşleşir (ücret modu, isteğe bağlı dinamik ücret).
OpenPositionV2 / OpenPositionWithToken22Nft
Mevcut bir pool içinde yeni bir pozisyon oluşturun.
Argümanlar
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.
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 depool.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_arrayeksik olanı bu talimat içindepayer’ın masrafına ayırır. Ayrı bir init-tick-array talimatı yoktur. - Kullanıcı kaynak ATA’larında en az
amount_0_maxveamount_1_maxtutarına sahiptir.
personal_positionvar,liquidityayarlanmış,fee_growth_inside_lastanlık görüntüsü alınmış.tick_lowervetick_upperadreslerindeki 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 += Leğ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
OpenPositionV2veyaOpenPositionWithToken22Nftve 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.OpenPositionV1 dondurmaz.
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
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_actualtutarını kullanıcıdan → vault’lara aktarır.personal_position.liquidityvepool_state.liquidity(aralık içindeyse) artırır ve uç nokta-tickliquidity_gross/liquidity_netdeğ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_oweddeğerlerine yatırır. Bunlar yalnızcaDecreaseLiquidity/DecreaseLiquidityV2üzerinde ödenir, artış üzerinde değil — bağımsız bir toplama talimatı yoktur.
DecreaseLiquidityV2
Bir pozisyondan likidite kaldırın.
Argümanlar
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.- Kaldırılan
Liçin geçerlisqrt_price_x64verildiğinde(amount_0, amount_1)hesaplar. - Son dokunuştan bu yana tahakkuk eden ücretleri/ödülleri kapatır,
IncreaseLiquidityile aynı. amount_0 + fees_owed_0veamount_1 + fees_owed_1tutarlarını 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ı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 bunuPoolStateolarak yükler ve çözme işlemini imzalamak için PDA seed’lerini kullanır.
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Tüm reward sayaçları
reward_amount_owed == 0.
- 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.
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
Ç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.statusswap’a izin verir.now >= open_time.sqrt_price_limit_x64yön içinsqrt_price_x64’ün doğru tarafında.
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):
- Dinamik ücret ek ücreti —
pool.dynamic_fee_infosıfır değilse, program volatilite biriktiricisini son swap’tan bu yana geçilen tick mesafesi kullanarak günceller (ücretproducts/clmm/feeskurallarından filtre/bozunma ile) veAmmConfig.trade_fee_rate’in üzerine birdynamic_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 by
order_phase), ardından LP likidite eğrisi boyunca devam eder. Doldurulmuş miktarlartick.unfilled_ratio_x64vetick.part_filled_orders_remaining’i 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ı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 − feealır); giriş olduğu yönler için davranışFromInputile eşleşir.PoolState’dekiis_fee_on_input(zero_for_one)veis_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
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.
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.- Ne
input_token_accountne deoutput_token_accountdonmuş değil (aksi takdirdeNotApproved). pool_state.statushem swap (bit 4) hem de limit-order (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’ı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.
limit_ordervar, açılış zamanındatick.order_phasevetick.unfilled_ratio_x64’ü anlık görüntüler.tick.orders_amount += amount(mevcut kohortda).limit_order_nonce.order_nonce += 1.OpenLimitOrderEventyayınlanır.
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
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 önceDecreaseLimitOrderveyaSettleLimitOrder’ı çağırmalı.
amount’ı sahibinin ATA’sındaninput_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
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. amountdoldurulmamış girişiinput_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_amountdoldurulmuş ve kapatılmış, ya da sahip daha önce siparişi sıfıra düşürmüş ve kapatmayı unutmuş).
limit_order’ı kapatır; kiralimit_order.owner’a gönderilir.
CreateDynamicFeeConfig (yönetici)
Bir u16 indeksi altında yeniden kullanılabilir bir parametre seti oluşturun.
Argümanlar
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.
İş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_statetarafından sahip değildir. InsufficientFunds: bir programa ait hesap kendi kira minimumundan daha az tutar.
@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:
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_statebaşı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
Bir pozisyona borçlu olunan ödüllerDecreaseLiquidity / 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
products/clmm/code-demos— çalıştırılabilir TypeScript örnekleri.products/clmm/fees— işlem ücreti ve ödül tahakkuku hakkında ayrıntılar.reference/error-codes— tam CLMM Anchor hata tablosu.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

