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 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: Ve yaratıcı başına isteğe bağlı bir hesap:

Sadece iki mint’ten bir havuz türetme

Havuz PDA’sını türetmeden önce her zaman mint’leri sıralayın. Seed, iki mint’i kullanıcı sırasında değil, bayt sırasında hash’ler. (A, B) ve (B, A) ile iki havuz zincirde çarpışırdı — sıralama, programın eşlemeyi kanonik hale getirme yoludur.
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 ile 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() öğesinden 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 entegrasyondan okuyacağınız alanlardır.

PoolState

Gerçekten okunması gerekenler:
  • lp_supply — havuzun iç LP toplamı. LP mint’inin arzına eşit değildir: tam olarak 100 temel birim daha yüksektir, çünkü 100 kilitli birim burada sayılır ancak hiçbir zaman mint’lenmez. Tüm LP-paylaşım matematiği (yatırma, çekme) lp_supply ile bölünür, bu nedenle bu alanı kullanın ve mint’in zincir üstü arzını yerine koymayın.
  • 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 oturur. protocol_fees_token{0,1} ayrıca bir yaratıcı ücreti toplandığında yaratıcı ücretinin protokol payını alır, bu nedenle swap’ların dışında büyür — products/cpmm/fees sayfasına bakın.
  • status — Swap, Deposit, Withdraw işlemlerine izin verilip verilmediğini kontrol eden bir bitmask. Yönetici 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; bunlar bağımsızdır.
  • open_time — Unix zaman damgası. Bu saatten önce swap’lar başarısız olur. Yatırmalara bu saatten önce izin verilir, böylece havuz tohumlanabilir.
  • creator_fee_on / enable_creator_fee — birlikte isteğe bağlı yaratıcı ücretinin bu havuz için 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 = swap girdisi olan token’dan ücret al (BothToken); 1 = sadece token_0 öğesinden ücret al (token_1 → token_0 swap’larını atla); 2 = sadece token_1 öğesinden ücret al. Havuz oluşturma sırasında InitializeWithPermission aracılığıyla ayarlanır; daha sonra değişemez.
  • creator_fees_token_{0,1} — CollectCreatorFee veya CollectCreatorFeePermissionless tarafından taranmış birikmiş yaratıcı ücretleri. Her iki yol da tam sayaçları sıfırlar, ancak 2026-09-19 yaratıcı-ücret-paylaşım yükseltmesinden bu yana bakiyenin yalnızca bir kısmı havuzdan ayrılır: protokolün payı protocol_fees_token_{0,1} öğesine eklenir ve geri kalan yaratıcıya aktarılır. İzinsiz yol alıcıları pool_creator’ın kanonik ATA’larına sabitler. PoolState kendisi değişmedi — paylaşılan miktar için ayrı bir sayaç yoktur.

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 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. Bayt sırasında bir hata, yaygın bir 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 hiçbir zaman 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 üzerinde 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 üzerinde 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 hiçbir zaman LP / protokol / fon paylarını işlem ücretinden azaltmaz. Tarama CollectCreatorFee veya hedef-kısıtlı CollectCreatorFeePermissionless aracılığıyla yapılır ve her iki yol da birikmiş bakiyenin bir payını protokole verir — creator_fee_share_rate oranında veya bu (creator, amm_config) çifti için bir CreatorFeeShare PDA mevcut olduğunda o orandaki oran. Tam mekanikler 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 yöneticisi 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 yönetici tarafından yapılırdı. 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.

CreatorFeeShare

Bir (havuz yaratıcısı, AmmConfig) çifti için protokolün yaratıcı ücret payını geçersiz kılan isteğe bağlı bir hesap. 2026-09-19 yaratıcı-ücret-paylaşım yükseltmesiyle eklendi.
Nasıl davranır:
  • İsteğe bağlıdır, ancak hesap talimatta hiçbir zaman isteğe bağlı değildir. CollectCreatorFee ve CollectCreatorFeePermissionless her ikisi de yukarıdaki seed kısıtlaması ile creator_fee_share bildirir ve her çağrıda alırlar. Program daha sonra hesabın boş veya yabancı sahipli olup olmadığını kontrol eder; öyleyse AmmConfig.creator_fee_share_rate öğesine geri döner. Bu nedenle bir istemci, hesabın var olup olmadığına bakılmaksızın her zaman adresi türetmeli ve geçirmelidir.
  • share_rate oluşturma sırasında FEE_RATE_DENOMINATOR_VALUE (1_000_000) ile sınırlandırılır ve bölme çalıştığında tekrar. 1_000_000 tüm yaratıcı ücretini protokole yönlendirir; 0 hiçbirini yönlendirmez.
  • Yönetici veya özel bir yetkili tarafından oluşturulur ve kapatılır CreateCreatorFeeShare / CloseCreatorFeeShare aracılığıyla. Kapatmak kirayı imzalayana geri verir ve çifti config varsayılanına düşürür; havuz yaratıcısı her iki yolda da imzalayan değildir.
  • Havuz tarafından değil, yaratıcı tarafından anahtarlanır. Bir hesap, o yaratıcının o AmmConfig üzerinde sahip olduğu her havuzu yönetir. İki ücret seviyesinde havuzları olan bir yaratıcı, her ikisinde de kapsanmak için iki hesaba ihtiyaç duyar.
Yönlendirdiği bölme aritmetiği products/cpmm/fees sayfasındadır.

Vault’lar ve Token-2022

vault0 ve vault1 CPMM authority PDA tarafından sahiplenilir ve bunların token-program sahibi (token_program) SPL Token veya Token-2022’dir, havuz oluşturma sırasında mint’in programı tarafından belirlenir. 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 uzantı izin listesi uygular (utils/token.rs içinde is_supported_mint). Bir Token-2022 mint, CPMM havuzunda kullanılabilir, ancak ve ancak taşıdığı her uzantı bu listedeyse:
  • TransferFeeConfig. Mint tarafından her transferde uygulanır. Havuz SwapBaseInput yatırmaları için alıcı tarafında ve çekme işlemleri için 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. Mint üzerinde standart meta veriler. Swap matematiğine hiçbir etkisi yoktur.
  • 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ı işlemek için Token-2022 yardımcılarını çağırmalıdır.
  • ScaledUiAmount. UI-görüntü ölçekleme uzantısı. InterestBearingConfig ile aynı işlem — eğri ham miktarları kullanır.
Diğer herhangi bir uzantı — PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority, vb. — Initialize işleminin NotSupportMint ile reddedilmesine neden olur. Bir istisna vardır: mint başına kayıt defteri: seed [b"support_mint", mint] konumunda bir SupportMintAssociated PDA mevcutsa, mint uzantı setinden bağımsız olarak kabul edilir. Bu PDA, yönetici (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ştirildi. CPMM daha önce sabit kodlanmış dört adresli MINT_WHITELIST taşırdı ve bu, uzantı kontrolünü kısa devre yaptırdı. Bu dizi kaldırıldı; kayıt defteri PDA artık tek bypass’tır. Sabit kodlanmış 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.
Onaylı-uzantı 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 bir 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 bayttır (8 + 16 + 16), bu nedenle dizi tek başına 4.000 bayttır; ObservationState::LEN tam olarak 4.075 bayttır (8 + 1 + 2 + 32 + 4,000 + 8 × 4). İki tüketici kuralı:
  • Tek bir observation’ı fiyat olarak kullanmayın. Bu bir kümülatif, spot fiyat değildir. TWAP hesaplamak için ikisini kullanın.
  • En az bir blok aralığında observation’ları seçin. Aynı blok içindeki swap’lar yeni bir observation üretmeyebilir; arka arkaya okuma 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ı hiçbir zaman kapatılmaz. Permission, SupportMintAssociated ve CreatorFeeShare istisnalardır — bunlar havuz state’i değil, bağımsız yönetici tarafından yönetilen kayıtlardır ve her birinin açık bir kapatma talimatı vardır. 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 okuyacağınız

Kaynaklar: