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.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
* 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_mintbayt 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.SupportMintAssociatedPDA’sı (tohum[b"support_mint", mint]) olan bir mint uzantı kontrolünü atlar — ancak bu PDA’yıremaining_accountsadresine 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 deNotSupportMint(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. creatorilgili ATA’larda en azinit_amount_0veinit_amount_1öğesine sahiptir.amm_config.disable_create_pool == false.
pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1)— tam karekök. Yaratıcılp_supply − 100basılır; kilitli 100 temel birimlp_supplyiç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_supplyile bölünür, bu nedenle bu alanı kullanın ve mint’in zincir üstü arzını yerine koymayın.sqrt(...) < 100iseInitLpAmountTooLessile geri döner. observation_statebaşlatılır;observation_index = 0vepool_id = pool_state.key().create_pool_feelamportları 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 = falsevecreator_fee_on = BothToken.Initializeyaratıcı ücretini etkinleştirmeyi desteklemez — bu yolInitializeWithPermissionadresine gider.open_time, çağıran<= block_timestampdeğeri geçtiyseblock_timestamp + 1olarak yükseltilir. Takaslaropen_timetarihinden önce reddedilir; depozitolar ve çekilmeler hemen çalışır.
reference/error-codes adresinde)
InvalidInput— mint’ler sıralanmamış veya özdeş mint’ler.NotSupportMint— engellenen Token-2022 uzantısı.ExceededSlippage— nadiren;init_amount_0/1ondalık uyuşmazlığı nedeniyle sıfır LP ile sonuçlanırsa.
Deposit
Havuza orantılı olarak her iki tokende likidite ekleyin.
Argümanlar
Matematik
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).
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
İ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
lp_supply -= lp_token_amount.- Kasalar
out_token_0/out_token_1gönderir (brüt; kullanıcı herhangi bir Token-2022 transfer ücreti net alır).
SwapBaseInput
Tam giriş takas.
Argümanlar
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_statustakasa izin verir.- Bu yetki için hiçbir mint duraklatılmamış veya dondurulmamış.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— ticaret sıfıra yuvarlanır.NotApproved— havuzUpdatePoolStatusaracı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
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
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
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
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
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
Ön koşullar
- Aynı
indexile mevcutAmmConfigyok. 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 edertrade_fee_rate + creator_fee_rate < 1_000_000)param = 1→protocol_fee_rate(iddia eder≤ 1_000_000ve+ fund_fee_rate ≤ 1_000_000)param = 2→fund_fee_rate(iddia eder≤ 1_000_000ve+ protocol_fee_rate ≤ 1_000_000)param = 3→protocol_owner. Yeni anahtarvalueadresinde değil:remaining_accounts[0]adresine ekleyin (salt okunur iyidir). Varsayılan genel anahtar olmamalıdır ve hesabı atlayan birunwrap()adresinde panik yapar.param = 4→fund_owner.3ile aynı mekanizma.param = 5→create_pool_feeparam = 6→disable_create_pool(sıfır olmayan herhangi birvaluedevre dışı bırakır)param = 7→creator_fee_rate(iddia edercreator_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ölenprotocol_fee_rateile ilgili değildir.
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
Ön koşullar
share_rate <= 1_000_000, aksi takdirdeInvalidInput(6003).- PDA zaten var olmamalıdır — Anchor’ın
initaynı ç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.
creator_fee_sharebump,creator,amm_configveshare_rateadresini depolar.amm_configaltındacreatortarafından oluşturulan bir havuzda sonraki herCollectCreatorFee/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ı
owneradresine gider. - Bu çift için koleksiyonlar
AmmConfig.creator_fee_share_rateadresinden payı çözümler —UpdateAmmConfigparam8ayarlanmadığı sürece0olan.
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.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
products/cpmm/code-demos— yukarıdakiler için çalıştırılabilir TypeScript örnekleri.reference/error-codes— tam Anchor hata tablosu.products/cpmm/fees—Collect*Feetalimatlarının boşalttığı ücret-tahakkuk modeli.

