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 →
CPMM için Program ID ve PDA seed’leri reference/program-addresses sayfasında kanonik olarak listelenmiştir. Bu sayfa her hesabın ne işe yaradığına ve koruduğu değişmezliklere odaklanır, sabit kodlanmış adresler değil.

Bir CPMM havuzunun altı hesabı

Her CPMM havuzu, CPMM programı altında altı program türetilmiş adres (PDA) ve bunların referans aldığı bir paylaşılan AmmConfig hesabı tarafından tamamen tanımlanır. İki mint’e sahip olduğunuzda, ağa dokunmadan her şeyi belirleyici bir şekilde türetebilirsiniz. Ve paylaşılan config:

Bir havuzu sadece iki mint’ten türetme

Havuz PDA’sını türetmeden önce her zaman mint’leri sıralayın. Seed, iki mint’i kullanıcı sırasına göre değil byte sırasına göre hash’ler. (A, B) ve (B, A) ile iki havuz zincirde çarpışırdı — sıralama, programın eşlemeyi kanonik hale getirme yöntemidir.
Havuz ID’si her zaman kanonik PDA değildir. Initialize, yukarıdaki PDA’ya ek olarak pool_state olarak rastgele bir imzalayan keypair’i kabul eder. Geçirilen hesap kanonik PDA’yla eşleşmiyorsa, program bunun bir imzalayan olmasını gerektirir — yani yaratıcı imzaladığı yeni bir keypair geçirir. Bu ön-çalıştırma savunmasıdır: kanonik PDA’yı ele geçirmeye çalışan herhangi bir üçüncü taraf, meşru yaratıcı tarafından rastgele bir keypair kullanılarak atlatılabilir. Aşağı akış PDA’ları (lpMint, vault0, vault1, observation) hala poolState.key() adresinden türetilir, bu nedenle kullanılan hangi adres olursa olsun benzersiz kalırlar. Havuzları indekslerken, kanonik PDA’yı türeterek değil, zincir üstü state’ten havuz ID’sini keşfedin (örn. CPMM programı altında PoolState hesapları) — ikincisi rastgele keypair havuzlarını kaçıracaktır.

Hesap düzenleri

Tam Rust tanımları raydium-cp-swap kaynağında bulunur. Aşağıdaki alanlar bir entegrasyon sırasında okuduğunuz alanlardır.

PoolState

Gerçekten okunması gerekenler:
  • lp_supply — havuzun LP mint’inin toplam arzının iç aynası. LP-share matematik için kullanın; değer mint’in zincir üstü arzıyla eşleşmeli, ancak bunu PoolState’ten okumak ekstra bir hesap getirmesini önler.
  • protocol_fees_token{0,1}, fund_fees_token{0,1} — henüz taranmamış birikmiş ücretler. Bunlar swap fiyatlandırmasını etkilemez; CollectProtocolFee / CollectFundFee çağrılana kadar vault’larda kalırlar.
  • statusSwap, Deposit, Withdraw’ın izin verilip verilmediğini kontrol eden bitmask. Admin tarafından UpdatePoolStatus aracılığıyla güncellenir. SDK bunu bir işlem oluşturmadan önce kontrol eder; doğrudan CPI yapıyorsanız, kendiniz kontrol edin.
  • token0_program / token1_program — her vault için CPI yapılacak token programı. Biri klasik SPL Token, diğeri Token-2022 olabilir; bağımsızdırlar.
  • open_time — Unix zaman damgası. Bu zamandan önce swap’lar başarısız olur. Havuz tohumlanabilmesi için open_time öncesinde depozitolara izin verilir.
  • creator_fee_on / enable_creator_fee — birlikte bu havuz için isteğe bağlı yaratıcı ücretinin etkin olup olmadığını ve swap’ın hangi tarafından toplandığını kontrol eder. enable_creator_fee == false yaratıcı-ücret yolunu tamamen sıfırlar. Etkinleştirildiğinde, creator_fee_on seçer: 0 = ücret hangi token swap girdisi ise ondan al (BothToken); 1 = sadece token_0’dan ücret al (token_1 → token_0 swap’larını atla); 2 = sadece token_1’den ücret al. Havuz oluşturma sırasında InitializeWithPermission aracılığıyla ayarlanır; daha sonra değişemez.
  • creator_fees_token_{0,1} — birikmiş yaratıcı ücretleri, CollectCreatorFee veya CollectCreatorFeePermissionless tarafından taranır. Her iki yol da tam sayaçları sıfırlar; izinsiz yol alıcıları pool_creator’ın kanonik ATA’larına sabitler.

AmmConfig

Dikkat edilmesi gereken üç şey:
  1. trade_fee_rate ve creator_fee_rate hacmin kesirleridir, her ikisi de 1/1_000_000 birimlerinde gösterilir. 2500 işlem hacminin %0.25’i anlamına gelir. protocol_fee_rate ve fund_fee_rate işlem ücretinin kesirleridir (hacmin değil), aynı 1/1_000_000 paydası ile. Yaratıcı ücreti işlem ücretinin bir kesri değildir — kendi bağımsız oranıdır. Tam aritmetik products/cpmm/fees sayfasındadır.
  2. index bir u16’dır, bu nedenle seed hash’i 2 bayt big-endian kullanır. Byte sırasında bir hata entegrasyon hatasıdır.
  3. AmmConfig havuz seviyesinde değişmezdir. Bir havuz oluşturma sırasında bir AmmConfig’e işaret eder ve asla değişmez. Ücret değişiklikleri yayılır çünkü havuz her swap’ta config’i okur — ancak havuz ücret seviyeleri arasında taşınamaz.
Yaratıcı ücretleri hakkında bir not: oran kendisi (creator_fee_rate) AmmConfig’te yaşar ve ücret seviyesi arasında paylaşılır. Belirli bir havuzun gerçekten ücret alıp almadığı (enable_creator_fee) ve swap’ın hangi tarafına iniş yaptığı (creator_fee_on) PoolState’te yaşar. Yaratıcı ücreti işlem ücretinden bağımsızdır — kendi oranıdır, kendi sayaçlarına birikir (creator_fees_token_{0,1}), ve asla LP / protokol / fon paylarını işlem ücretinden azaltmaz. Tarama CollectCreatorFee veya hedef-kısıtlı CollectCreatorFeePermissionless aracılığıyla yapılır. Tam mekanik için products/cpmm/fees sayfasına bakın.

Permission

InitializeWithPermission tarafından kullanılan küçük bir erişim-kontrol hesabı. CPMM programı, diğer programların (örn. LaunchLab bir token’ı CPMM’ye yükseltirken) belirli bir AmmConfig’e karşı havuz oluşturmaya yetkili olduklarını kanıtlayabilmeleri için izinli bir havuz-oluşturma yolunu destekler.
Permission PDA, CPMM admin’i veya özel bir permission-PDA yaratıcı yetkisi tarafından CreatePermissionPda aracılığıyla oluşturulur. 2026-09 yükseltmesinden bu yana, ClosePermissionPda aynı iki imzalayanı kabul eder; öncesinde sadece admin’di. Son kullanıcılar bu hesapla doğrudan etkileşime girmezler — bu çapraz-program akışları için tesisattır. Rol sınırı için security/admin-and-multisig sayfasına ve kanonik adresler için reference/program-addresses sayfasına bakın.

Vault’lar ve Token-2022

vault0 ve vault1 CPMM authority PDA tarafından sahiplenilir ve bunların token-program sahibi (token_program) havuz oluşturma sırasında mint’in programı tarafından belirlenen SPL Token veya Token-2022’dir. Havuz iki durumu şeffaf bir şekilde işler — Swap / Deposit / Withdraw talimatı hesaplarında her taraf için doğru token-program ID’sini geçersiniz. CPMM, havuz oluşturma sırasında katı bir extension allow-list uygular (utils/token.rs içinde is_supported_mint). Bir Token-2022 mint’i CPMM havuzunda kullanılabilir, ancak ve ancak her extension’ı bu listedeyse:
  • TransferFeeConfig. Mint tarafından her transfer’de uygulanır. Havuz SwapBaseInput depozitolarında alıcı tarafında ve çekilişlerde gönderici tarafındadır. Program vault’a inen net miktarı hesaplar ve eğriyi buna göre ayarlar. algorithms/token-2022-transfer-fees sayfasına bakın.
  • MetadataPointer ve TokenMetadata. Standart on-mint metadata. Swap matematik’i etkilemez.
  • InterestBearingConfig. Mint’in UI miktarı faiz biriktirir. Vault ham miktarları depolar; eğri sadece ham miktarlar üzerinde çalışır. APR gösteren UI’lar, UI miktarını render etmek için Token-2022 yardımcılarını çağırmalıdır.
  • ScaledUiAmount. UI-display ölçekleme extension’ı. InterestBearingConfig ile aynı muamele — eğri ham miktarları kullanır.
Diğer herhangi bir extension — PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, vb. — Initialize’ı NotSupportMint ile reddetmesine neden olur. Bir istisna vardır: per-mint registry — eğer seed [b"support_mint", mint] adresinde bir SupportMintAssociated PDA varsa, mint extension set’ine bakılmaksızın kabul edilir. Bu PDA, admin (veya özel bir support-mint yetkisi) tarafından CreateSupportMintAssociated / CloseSupportMintAssociated aracılığıyla oluşturulur ve kaldırılır, bu nedenle belirli bir mint’i ekleme artık program yükseltmesi gerektirmez.
2026-09’da değişti. CPMM daha önce extension kontrolünü kısa devre yapan sabit kodlanmış dört adresli MINT_WHITELIST taşıyordu. Bu dizi kaldırıldı; registry PDA artık tek bypass’tır. Sabit listeye güvenen herhangi bir mint, yeni bir havuz oluşturulmadan önce bir SupportMintAssociated PDA’ya ihtiyaç duyar — mevcut havuzlar etkilenmez, çünkü kontrol sadece havuz oluşturma sırasında çalışır.
Doğrulanmış-extension listesi CP-Swap kaynağında programs/cp-swap/src/utils/token.rs altında yaşar ve gelecekteki program yükseltmeleriyle değişebilir. Çapraz-program matrisi için reference/token-2022-support sayfasına bakın.

Observation

Observation hesabı, her biri bir block_timestamp ve kümülatif fiyat depolayan ObservationState girdilerinin ring buffer’ıdır. Her swap’ta, son birinden yeterli zaman geçtiyse program yeni bir observation ekler. TWAP’lar iki observation okuyarak ve Δcumulative / Δtime bölerek hesaplanır.
Ring buffer 100 observation için boyutlandırılmıştır. Her observation 40 bayt’tır, bu nedenle dizi tek başına 4.000 bayt’tır; tam ObservationState PDA çevreleyen alanlar ve discriminator’dan sonra yaklaşık 4.100 bayt’tır. İki tüketici kuralı:
  • Tek bir observation’ı fiyat olarak kullanmayın. Bu kümülatif’tir, spot fiyat değil. TWAP hesaplamak için ikisini kullanın.
  • En az bir blok aralıklı observation’ları seçin. Aynı blok içindeki swap’lar yeni bir observation üretmeyebilir; arka arkaya okumak aynı kaydı döndürebilir.
Daha fazla matematik products/clmm/accounts sayfasındadır.

Hesap yaşam döngüsü

CPMM havuzları ve bunların PDA’ları asla kapatılmaz. Sıfır likidite olsa bile poolState kalır. Bu kasıtlıdır: aynı havuzu daha sonra yeniden tohumlamak, tarihsel observation buffer’ını korur ve PDA türetmesi istikrarlı kalır.

Nerede ne okunur

Kaynaklar: