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 yetkili talimat referansıdır. Bu talimatları gerçekten oluşturan kod için bkz. products/cpmm/code-demos. Hata kodu anlamları için reference/error-codes bölümüne bakın.2026-09 program yükseltmesi CPMM’yi Anchor 1.0.2 / Solana 3.1.10 üzerine yeniden inşa etti, admin talimatı CollectExcessLamports ekledi, sabit kodlanmış Token-2022 mint beyaz listesini kaldırdı ve CreateAmmConfig’in protocol_owner / fund_owner alanlarına ne yazacağını değiştirdi. Hiçbir kullanıcı tarafından görülen talimat hesaplarını, argümanlarını veya matematiklerini değiştirmedi. 2026-09-09 changelog girişine bakın.
Her iki yaratıcı ücret toplama talimatı da 2026-09-19 tarihinde hesap listelerini değiştirdi. CollectCreatorFee creator_fee_share kazanır; CollectCreatorFeePermissionless amm_config ve creator_fee_share kazanır. Her ikisi de system_program sonrasına eklenir, bu nedenle mevcut bir istemcinin hâlihazırda geçirdiği her hesap kendi dizinini korur — ancak yeni hesaplar zorunludur, bu nedenle eski düzene karşı inşa edilen bir işlem eksik kalır ve Anchor’ın AccountNotEnoughKeys (3005) hatasıyla reddedilir. İki admin talimatı — CreateCreatorFeeShare ve CloseCreatorFeeShare — eklenir ve UpdateAmmConfig yeni bir param = 8 alır. 2026-09-19 changelog girişine bakın.

Talimat özeti

Durum bit maskesi: her havuzun status alanı bir u8 olup, bit 0 = depozito devre dışı, bit 1 = çekilme devre dışı, bit 2 = takas devre dışı (PoolStatusBitIndex { Deposit, Withdraw, Swap } programda). Temiz bir bit işlemin izin verildiği anlamına gelir; ayarlanmış bir bit duraklatıldığı anlamına gelir. UpdatePoolStatus ham bir u8 alır ve mevcut değerin üzerine yazar. Sonraki bölümler her birini ayrıntılı olarak ele alır. Hesap sıralaması CPMM IDL’sini izler; SDK ve raydium-cp-swap/programs/cp-swap/src/instructions içindeki Rust istemcisi bu sırayı eşleştirir.

Initialize

Yeni bir CPMM havuzu oluşturun. Argümanlar
Hesaplar (W = yazılabilir, S = imzalayan) * pool_state yalnızca rastgele anahtar yolunda imzalar; kanonik-PDA yolu pool_state imzalaması olmadan çalışır. Ön koşullar
  • Mint’ler sıralanmıştır (token_0_mint < token_1_mint bayt sırasına göre).
  • Hiçbir mint, CPMM izin listesi dışında bir uzantı kullanmaz (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — bkz. products/cpmm/accounts. SupportMintAssociated PDA’sı (tohum [b"support_mint", mint]) olan bir mint uzantı kontrolünü atlar — ancak bu PDA’yı remaining_accounts adresine eklemelisiniz. Program yalnızca geçirdiğiniz hesapları tarar ve PDA’yı asla kendisi yüklemez, bu nedenle hesabı sağlamadan kayıt defterine güvenmek yine de NotSupportMint (6007) ile başarısız olur. Sıra önemli değildir (eşleştirme anahtarla yapılır); bypass gereken her mint için bir giriş geçirin. Bu kayıt defteri, 2026-09 yükseltmesi sabit kodlanmış dört mint beyaz listesini kaldırdığından beri tek bypass’tır.
  • creator ilgili ATA’larda en az init_amount_0 ve init_amount_1 öğesine sahiptir.
  • amm_config.disable_create_pool == false.
Son koşullar
  • pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1) — tam karekök. Yaratıcı lp_supply − 100 basılır; kilitli 100 temel birim lp_supply içinde sayılır ancak asla basılmaz.
  • Yani havuzun ömrü boyunca lp_mint.supply == pool_state.lp_supply − 100. Tüm LP-pay matematiği (depozito, çekilme) lp_supply ile bölünür, bu nedenle bu alanı kullanın ve mint’in zincir üstü arzını yerine koymayın. sqrt(...) < 100 ise InitLpAmountTooLess ile geri döner.
  • observation_state başlatılır; observation_index = 0 ve pool_id = pool_state.key().
  • create_pool_fee lamportları yaratıcıdan alıcıya aktarılır ve yerel SOL olarak senkronize edilir (wSOL ATA’sıdır).
  • Havuzun durum bit maskesi 0 (depozito / çekilme / takas tümü etkindir).
  • enable_creator_fee = false ve creator_fee_on = BothToken. Initialize yaratıcı ücretini etkinleştirmeyi desteklemez — bu yol InitializeWithPermission adresine gider.
  • open_time, çağıran <= block_timestamp değeri geçtiyse block_timestamp + 1 olarak yükseltilir. Takaslar open_time tarihinden önce reddedilir; depozitolar ve çekilmeler hemen çalışır.
Yaygın hatalar (tam liste reference/error-codes adresinde)
  • InvalidInput — mint’ler sıralanmamış veya özdeş mint’ler.
  • NotSupportMint — engellenen Token-2022 uzantısı.
  • ExceededSlippage — nadiren; init_amount_0/1 ondalık uyuşmazlığı nedeniyle sıfır LP ile sonuçlanırsa.

Deposit

Havuza orantılı olarak her iki tokende likidite ekleyin. Argümanlar
Hesaplar Matematik
Sabitlenmeye değer iki ayrıntı: orantılı taban ücret hariç kasa toplamıdır (vault_amount_without_fee, yani ham bakiye eksi birikmiş protokol, fon ve yaratıcı sayaçları), ham kasa bakiyesi değil; ve kayma sınırı, ödeyicinin gerçekten aktardığı şeye karşı kontrol edilir, Token-2022 transfer ücreti eklendikten sonra, brüt kasa hareketi değil. k’nin orantılılığında değişiklik yok — hem toplamlar hem de lp_supply aynı faktörle ölçeklenir. Son koşullar
  • lp_supply += lp_token_amount.
  • vault_0 += needed_token_0 (giriş üzerindeki herhangi bir Token-2022 transfer ücreti net).
  • vault_1 += needed_token_1 (giriş üzerindeki herhangi bir Token-2022 transfer ücreti net).
Yaygın hatalar — ExceededSlippage, ZeroTradingTokens, depozito duraklatılmışsa InvalidStatus.

Withdraw

LP tokenlarını yakın ve her iki temel tokeni orantılı olarak alın. Argümanlar
Hesaplar İlk 13 hesap Deposit ile aynıdır ve LP tokenları yakıldığı için lp_mint yazılabilirdir. Withdraw ek olarak 14. hesabı alır, memo_program (kısıtlı address = memo::ID) — Deposit almaz. 13 hesaplı bir Withdraw Anchor seri durumdan çıkarmada başarısız olur, bu nedenle LP çıkamaz. Matematik
Son koşullar
  • lp_supply -= lp_token_amount.
  • Kasalar out_token_0 / out_token_1 gönderir (brüt; kullanıcı herhangi bir Token-2022 transfer ücreti net alır).

SwapBaseInput

Tam giriş takas. Argümanlar
Hesaplar Sıralama giriş → çıkış kullanıcının yönüne göre, havuzun kanonik token_0 / token_1 değerine göre değil. Program mint’leri eşleştirerek hangi kasanın hangisi olduğunu anlar. Matematik — bkz. products/cpmm/math. Ön koşullar
  • open_time <= now.
  • pool_status takasa izin verir.
  • Bu yetki için hiçbir mint duraklatılmamış veya dondurulmamış.
  • amount_in > 0.
Yaygın hatalar
  • ExceededSlippage — amount_out < minimum_amount_out.
  • ZeroTradingTokens — ticaret sıfıra yuvarlanır.
  • NotApproved — havuz UpdatePoolStatus aracılığıyla takaslar için duraklatılmıştır.
  • InvalidInput — mint’ler havuzun kasa mint’lerinden hiçbiriyle eşleşmez.

SwapBaseOutput

Tam çıkış takas. Argümanlar
Hesaplar — SwapBaseInput ile aynı. Matematik — ters eğri tavana sahip, bkz. products/cpmm/math. Yaygın hatalar — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Kasalardan protokol hedefine birikmiş protokol ücretlerini temizleyin. Argümanlar — hiçbiri. Hesaplar Etki
Eğrinin etkin bakiyelerinde değişiklik yok (birikmiş ücretler zaten hariç tutulmuştu). Yaygın hata — InvalidOwner (6001) imzalayan amm_config.protocol_owner veya program admin değilse. (Bu yolda NotApproved yoktur.)

CollectFundFee

CollectProtocolFee ile aynı şekil ancak amm_config.fund_owner tarafından imzalanır — veya yine program admin — ve fund_fees_* sayaçlarını sıfırlar. Yanlış imzalayan üzerinde aynı InvalidOwner.

CollectCreatorFee

pool_state.pool_creator tarafından imzalanır. Birikmiş yaratıcı ücretini kapatır ve yaratıcının kısmını yaratıcının token hesaplarına aktarır. Argümanlar — hiçbiri. Hesaplar Etki
Protokolün payı burada kasadan asla çıkmaz — protokol ücreti olarak yeniden etiketlenir ve CollectProtocolFee için bekler. Her iki sayaç zaten eğrinin kasa görüşünden hariç tutulmuştur, bu nedenle havuzun fiyatı hareket etmez. Tam türetme products/cpmm/fees adresinde. Yaygın hatalar — her iki yaratıcı sayacı da sıfır olduğunda NoFeeCollect (bölünmeden önce kontrol edilir), çözümlenen share_rate 1_000_000 aşarsa InvalidInput (6003), payı protocol_fees_token_* adresine kaydetmek taşarsa MathOverflow (6011) ve creator_fee_share kanonik PDA değilse Anchor’ın ConstraintSeeds hatası.

CollectCreatorFeePermissionless

Herkes yaratıcı-ücret toplamasını tetikleyebilir. Talimat her zaman yaratıcının kısmını pool_state.pool_creator tarafından sahiplenilen kanonik ilişkili token hesaplarına gönderir; çağıran başka bir yaratıcı veya hedef seçemez. Her iki ATA eksikse, ödeyici oluşturulmasını finanse eder. Orijinal CollectCreatorFee çağrılabilir kalır, bu nedenle kendi koleksiyonunu imzalamak isteyen bir yaratıcı yine de yapabilir. Argümanlar — hiçbiri. Hesaplar
İki yeni hesap araya eklenmez, system_program sonrasına eklenir. payer adresinden system_program adresine kadar her hesap yükseltmeden önce sahip olduğu konumu korur, bu nedenle kırılma temiz bir kırılmadır: yükseltme öncesi on dört hesaplı düzene karşı inşa edilen bir işlem kasaları yapılandırma hesapları olarak yanlış okumaz — yalnızca çok az hesap geçirir ve Anchor onu, herhangi bir kısıtlama çalışmadan önce AccountNotEnoughKeys (3005) ile reddeder. Hesaplar yine de zorunludur, bu nedenle her ikisini de sona ekleyin ve IDL’yi yenileyin; eski düzen için bir uyumluluk yolu yoktur.
Etki — yukarıdaki CollectCreatorFee ile aynı: pay creator_fee_share veya amm_config adresinden çözümlenir, protokolün kısmı protocol_fees_token_{0,1} adresine kaydedilir, yaratıcının kısmı yaratıcı ATA’larına aktarılır, her iki yaratıcı sayacı sıfırlanır ve recent_epoch güncellenir. Her iki sayaç da sıfır olduğunda NoFeeCollect döndürür.

UpdatePoolStatus

Bir havuzdaki bireysel işlemleri duraklatın veya devam ettirin. status alanı bir bit maskesidir: Argümanlar
Hesaplar Admin anahtarı programa derlenmiş bir genel anahtar (crate::admin::ID), BPF yükseltme yetkilisi değil — değiştirmek program yükseltmesi gerektirir. Değer için reference/program-addresses adresine ve kim tuttuğu için security/admin-and-multisig adresine bakın.

CreateAmmConfig

Yeni bir ücret katmanı oluşturun. Argümanlar
Hesaplar Ön koşullar
  • Aynı index ile mevcut AmmConfig yok.
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
2026-09’da değişti: yeni yapılandırmanın ücret sahipleri artık imzalayıcıdan gelmez. create_amm_config artık programın sabit kodlanmış protocol_fee_owner::ID adresini protocol_owner adresine ve fund_fee_owner::ID adresini fund_owner adresine yazar, bunun yerine admin imzalayıcının anahtarını her ikisine de kopyalar. Adresler reference/program-addresses adresindedir.Sonuçlar: yeni oluşturulan AmmConfig üzerindeki ücretler, admin’in yerine adanmış ücret cüzdanlarında yer alır. Admin, koleksiyon için kabul edilen bir imzalayan olarak kalır — CollectProtocolFee / CollectFundFee amm_config.protocol_owner / fund_owner veya crate::admin::ID adresini kabul eder — bu nedenle hiçbir şey temizlemek için döndürülmesi gerekmez; değişen tek şey, varsayılan olarak gelirlerin nereye gittiğidir. Mevcut AmmConfig hesapları yeniden yazılmaz — bunlarda depolanan her şey yine de yönetir, bu nedenle her zaman hesaptan protocol_owner / fund_owner adresini okuyun, her iki değeri de varsaymayın. UpdateAmmConfig parametreleri 3 ve 4 yine de onları döndürür.

UpdateAmmConfig

Mevcut bir AmmConfig üzerindeki ücret oranlarını veya sahipliği değiştirin. Bir param: u8 (hangi alanı güncelleyin) ve bir value: u64 alır. Tam gönderme tablosu:
  • param = 0 → trade_fee_rate (iddia eder trade_fee_rate + creator_fee_rate < 1_000_000)
  • param = 1 → protocol_fee_rate (iddia eder ≤ 1_000_000 ve + fund_fee_rate ≤ 1_000_000)
  • param = 2 → fund_fee_rate (iddia eder ≤ 1_000_000 ve + protocol_fee_rate ≤ 1_000_000)
  • param = 3 → protocol_owner. Yeni anahtar value adresinde değil: remaining_accounts[0] adresine ekleyin (salt okunur iyidir). Varsayılan genel anahtar olmamalıdır ve hesabı atlayan bir unwrap() adresinde panik yapar.
  • param = 4 → fund_owner. 3 ile aynı mekanizma.
  • param = 5 → create_pool_fee
  • param = 6 → disable_create_pool (sıfır olmayan herhangi bir value devre dışı bırakır)
  • param = 7 → creator_fee_rate (iddia eder creator_fee_rate + trade_fee_rate < 1_000_000)
  • param = 8 → creator_fee_share_rate (iddia eder ≤ 1_000_000). 2026-09-19’te eklendi. Protokolün bu katmandaki yaratıcı ücretinin varsayılan payı; bkz. products/cpmm/fees. Ticaret ücretini bölen protocol_fee_rate ile ilgili değildir.
Başka herhangi bir param InvalidInput döndürür. Değişiklikler admin tarafından imzalanır ve bu AmmConfig adresine bağlı her havuzu sonraki takasta etkiler. Geçiş yok; havuzlar yeni değerleri okur.

CreateCreatorFeeShare

Bir (creator, amm_config) çifti için yaratıcı ücretinin özel bir protokol payını ayarlayın, bu ücret katmanında o yaratıcının sahip olduğu her havuz için AmmConfig.creator_fee_share_rate adresini geçersiz kılın. 2026-09-19 yaratıcı-ücret-payı yükseltmesinde eklendi. Argümanlar
Hesaplar Ön koşullar
  • share_rate <= 1_000_000, aksi takdirde InvalidInput (6003).
  • PDA zaten var olmamalıdır — Anchor’ın init aynı çift için ikinci çağrıda başarısız olur. Bir oranı değiştirmek için hesabı kapatın ve yeniden oluşturun.
Son koşullar
  • creator_fee_share bump, creator, amm_config ve share_rate adresini depolar.
  • amm_config altında creator tarafından oluşturulan bir havuzda sonraki her CollectCreatorFee / CollectCreatorFeePermissionless, yapılandırma yerine bu hesaptan payı çözümler.
Havuz yaratıcısı bu talimata taraf değildir ve imzalamaz. Oran koleksiyon zamanında okunur, bu nedenle ücretler zaten tahakkuk ettikten sonra oluşturulan bir geçersiz kılma da o birikmiş bakiyeye uygulanır.

CloseCreatorFeeShare

Geçersiz kılmayı kaldırın. Çift AmmConfig.creator_fee_share_rate adresine geri döner. Argümanlar — hiçbiri. Hesaplar Son koşullar
  • Hesap kapatılır ve lamportları owner adresine gider.
  • Bu çift için koleksiyonlar AmmConfig.creator_fee_share_rate adresinden payı çözümler — UpdateAmmConfig param 8 ayarlanmadığı sürece 0 olan.

CollectExcessLamports

CPMM’nin kontrol ettiği hesaplarda kira-muaf minimumun üzerinde oturan lamportların admin taraması. 2026-09 yükseltmesinde eklendi, böylece protokol SIMD-0437 kira azaltmasının her adımdan sonra hesaplarda bıraktığı aşırı finansmanı geri alabilir. Yalnızca fazlalık hareket eder. Token bakiyeleri, hesap verileri, sahipleri, havuz durumu ve eğri dokunulmaz ve talimat zaten minimumda olan bir hesaba karşı bir no-op’tir — bu nedenle her dağıtım adımından sonra yeniden çalıştırmak güvenlidir. Argümanlar — hiçbiri. Hesaplar
Sıralama düzeltmesi, 2026-09-19. Program artık remaining_accounts üzerinde iki geçiş yapar — her token-program CPI’sı ilk, sonra CPMM tarafından sahiplenilen PDA’ların doğrudan borçları. Bunları iç içe geçirmek, bir PDA bir CPI’dan önce borçlandırıldığında çalışma zamanının UnbalancedInstruction (“hesap bakiyeleri toplamı talimat öncesi ve sonrası eşleşmez”) ile iptal edildi, çünkü çağıranın bekleyen lamport değişiklikleri yalnızca bir CPI gerçekten taşıdığında hesaplara boşaltılır. Çağıranlar listeyi kendileri gruplandırmak veya sıralamak zorunda değildir.
Her kaynak hesabı nasıl işlenir Program kaynak hesabın owner adresine göre gönderir: Sınırsız bir remaining_accounts listesi aldığı için, işlem boyutu gerçek sınırdır — solana-fundamentals/rent-and-reclaimable-rent adresinde açıklanan cüzdan tarafı tarama ile aynı kısıtlama. Yaygın hatalar — InvalidOwner (6001, yanlış imzalayan), LamportsCalculateError (6015, wSOL gidiş-dönüş sıfıra net olmadı) ve program tarafından sahiplenilen yoldan bir hesap kendi kira minimumundan daha az tuttuğunda InsufficientFunds. SDK oluşturucu yok. @raydium-io/raydium-sdk-v2 bu talimat için bir oluşturucu göndermez ve raydium-sdk-V2-demo deposu da göndermez — bu bir admin yoludur. El ile kodlayın, solana-fundamentals/rent-and-reclaimable-rent adresindeki cüzdan tarafı tarama talimatı gibi.

Durum değişikliği matrisi

Sonraki adım

Kaynaklar: