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 →

Değişmez

CPMM, iki kasasında klasik sabit-çarpım değişmezini korur: x⋅y=kx \cdot y = k burada x, vault0 bakiyesidir alındıktan sonra herhangi bir Token-2022 transfer ücreti, ve y de benzer şekilde. Her swap, ticaret ücretleri LP’ye (protokol, fon ve yaratıcı paketleri k’ya doğru sayılmaz — kasada bulunurlar ancak eğri görünümünden hariç tutulurlar, aşağıdaki Eğri üzerindeki ücretler bölümüne bakınız) alındıktan sonra k' ≥ k bırakmalıdır. k bu nedenle LP’ler ücret tahakkuk ettirdikçe zaman içinde monoton olarak artar. LP payları havuzun rezervleri tarafından fiyatlandırılır, k tarafından değil: token0 cinsinden LP fiyatı=xlpSupply,token1 cinsinden LP fiyatı=ylpSupply\text{token0 cinsinden LP fiyatı} = \frac{x}{\text{lpSupply}}, \qquad \text{token1 cinsinden LP fiyatı} = \frac{y}{\text{lpSupply}} ΔLP LP tokenini yakarak tam olarak ΔLP × x / lpSupply token0 ve ΔLP × y / lpSupply token1 geri alırsınız. Ne eğri ne de k yatırım veya çekim sırasında hareket eder — yalnızca swaplar fiyatı değiştirir.

Swap yolunda ücret modeli

CPMM her swapda iki bağımsız oranlı ücret uygular:
  • Ticaret ücreti giriş tarafında alınır, AmmConfig.trade_fee_rate oranında ücretlendirilir. Daha sonra LP, protokol ve fon paylarına bölünür (LP payı kasada kalır ve k’yı büyütür; protokol ve fon payları kasa muhasebesi dışında çıkarılır).
  • Yaratıcı ücreti (yalnızca enable_creator_fee == true olduğunda etkin) AmmConfig.creator_fee_rate oranında ücretlendirilir. Giriş tarafında veya çıkış tarafında alınır, PoolState.creator_fee_on ve swap yönüne bağlı olarak (bkz. products/cpmm/fees). Kendi bir pakettidir — asla ticaret ücretinin bir dilimi değildir.
Protokolün yaratıcı ücretinin payı bu sayfada hiçbir yerde görünmez ve bu kasıtlıdır. CollectCreatorFee tahakkuk eden ücretleri eğrinin zaten hariç tuttuğu iki sayaç arasında hareket ettirdiğinde uygulanır — bir swap sırasında değil. Swap matematiği, teklifler ve k bununla ve bunu olmadan aynıdır. Bkz. products/cpmm/fees.
Tanımlayalım:
  • FEE_RATE_DENOMINATOR = 1_000_000
  • trade_fee_rate — AmmConfig’den, örn. 2500 = ilgili hacim tarafının %0,25’i
  • creator_fee_rate — AmmConfig’den, örn. 1000 = ilgili hacim tarafının %0,10’u
  • protocol_fee_rate, fund_fee_rate — 1/FEE_RATE_DENOMINATOR birimlerinde ticaret ücretinin, hacmin değil
Yaratıcı ücreti giriş tarafında olduğunda:
Yaratıcı ücreti çıkış tarafında olduğunda:
Her iki durumda da ticaret ücreti aynı şekilde bölünür:
protocol_fee + fund_fee + creator_fee tutarı kasalarda tutulur ancak havuz durumunda ayrı olarak izlenir (protocol_fees_token*, fund_fees_token*, creator_fees_token*). Sabit-çarpım değişmezi k' ≥ k kontrol ettiğinde, kasa bakiyeleri eksi üç tahakkuk etmiş ancak henüz toplanmamış ücret kullanır — böylece LP’ler yalnızca lp_fee yakalarlar. Toplama talimatları ve çalışılmış sayısal örnekler için products/cpmm/fees bölümüne bakınız.

SwapBaseInput (giriş-kesin)

“Kullanıcı bize giriş mint’inin tam olarak amount_in kadarını verir ve çıkış mint’inin en az minimum_amount_out kadarını alır.” Şimdilik Token-2022’yi göz ardı ederek:
Cebir yoluyla: amount_out=y⋅Δxnetx+Δxnet\text{amount\_out} = \frac{y \cdot \Delta x_{\text{net}}}{x + \Delta x_{\text{net}}} burada Δx_net = amount_in_after_trade_fee. Program daha sonra kasa muhasebesi öyle günceller ki, trade_fee’nin protokol/fon/yaratıcıya ait kısmı “tahakkuk” paketlerinde oturur (eğrinin sonraki x’ine dahil değildir), LP payı ise sonraki swap için x’e katılır.

Giriş tarafında Token-2022

Giriş mint’inin bir transfer-ücreti uzantısı varsa, mint kullanıcı → kasa transferinde ücretini keser. Yani kasa aslında amount_in − transfer_fee_in(amount_in) alır. CPMM programı bu nedenle şunu hesaplar:
ve eğriyi amount_in_after_trade_fee karşısında çalıştırır. Bu önemlidir çünkü eğri fiyatı kasaya inen net tutardan hesaplanır, kullanıcının başlık tutarından değil.

Çıkış tarafında Token-2022

Çıkış mint’inin bir transfer ücreti varsa, havuz amount_out’u kasasından kullanıcıya gönderir. Mint daha sonra çıkışta ücretini alır, böylece kullanıcı amount_out − transfer_fee_out(amount_out) alır. Program amount_out’u eğriden her zamanki gibi hesaplar, ancak teklifleri gösterirken havuzun “kasa gönderme” numarasını “kullanıcı alma” numarasına dönüştürmek entegratörün sorumluluğudur.

Kayma kontrolü

amount_out hesaplandıktan sonra:
Çıkış mint’i bir transfer ücreti alırsa, SDK transfer ücretini minimum_amount_out ayarlamadan önce uygular, böylece kayma sabiti kasanın gönderdiği şey değil, kullanıcının gerçekten alacağı şey cinsinden ifade edilir.

SwapBaseOutput (çıkış-kesin)

“Kullanıcı çıkış mint’inin tam olarak amount_out kadarını alacak ve giriş mint’inin en fazla maximum_amount_in kadarını ödemeye isteklidir.” Eğriyi Δx_net için ters çevirerek: Δxnet=⌈x⋅amount_outy−amount_out⌉\Delta x_{\text{net}} = \left\lceil \frac{x \cdot \text{amount\_out}}{y - \text{amount\_out}} \right\rceil Tavan önemlidir — tamsayı kesintisinden sonra k' ≥ k garantisini verir. Sonra:
Token-2022 girişinde şu şekilde sarın:
böylece kullanıcı, mint’in transfer-ücreti kesintisinden sonra havuz yine de gross_needed alacak kadar öder.

Kayma kontrolü

Çalışılmış örnek

Havuz durumu, Token-2022’yi göz ardı ederek:
  • x = 1_000_000_000_000 (token0’ın 1.000.000,000000, 6 ondalak)
  • y = 2_000_000_000_000 (token1’in 2.000.000,000000, 6 ondalak)
  • AmmConfig: trade_fee_rate = 2500, protocol_fee_rate = 120_000, fund_fee_rate = 40_000, creator_fee_rate = 0
Kullanıcı: SwapBaseInput ile amount_in = 1_000_000_000 (token0’ın 1.000,000000). Yaratıcı ücreti devre dışı (enable_creator_fee = false).
Aynı havuzun enable_creator_fee = true olması ve giriş tarafında creator_fee_rate = 1000 (%0,10) olması durumunda, program total_input_fee = ceil(1_000_000_000 * 3500 / 1_000_000) = 3_500_000 ücretlendirir, sonra bunu creator_fee = 1_000_000 ve trade_fee = 2_500_000 olarak böler. trade_fee üzerindeki protokol/fon/LP aritmetiği yukarıdaki örnekten değişmez — yaratıcı ücreti kendi pakettidir, creator_fees_token0’a tahakkuk eder ve protokol ve fon paketleriyle birlikte curve_x’ten hariç tutulur. Giriş mint’inin %1 Token-2022 transfer ücreti varsa, kasa 1_000_000_000 yerine 990_000_000 token alır ve sonraki her hesaplama bu net tutarı kullanır.

Gözlem güncelleme kuralı

Her swapda, program yeni bir gözlemi halka tamponuna itip itmeyeceğini değerlendirir:
İki özellik:
  • Kümülatif fiyat, spot fiyat değil. Tek bir gözlem bir fiyat değildir. t0 zamanından t1 zamanına TWAP almak için, her ucuna en yakın gözlemleri okuyun ve (cumulative(t1) − cumulative(t0)) / (t1 − t0) hesaplayın.
  • Örnekler hız sınırlıdır. Aynı slotta arka arkaya swaplar bir gözlemi paylaşabilir. Bir swaptan hemen sonra bir gözlem okumak bu nedenle bir slot kadar eski görünebilir — bu normaldir.
Daha fazlası products/clmm/accounts bölümünde.

Eğri üzerindeki ücretler

Bu ince kısım ve çağrı yapmaya değer. Eğri aritmetiği net kasa bakiyeleri karşısında çalışır — yani ham SPL bakiyesi eksi tahakkuk eden protokol, fon ve yaratıcı ücretleri (üçü de bağımsız paketlerdir — bkz. products/cpmm/fees). Somut bir resim:
Entegratörler için sonuçlar:
  • Ham bakiyelerden teklif vermeyin. Önce tahakkuk eden ücret alanlarını çıkarın veya SwapBaseInput’u simülasyon olarak çağırın ve dönüşünü alın.
  • CollectProtocolFee tokenları kasadan çıkarır. Toplama sonrasında raw_vault_balance düşer ancak curve_balance değişmez; havuzun fiyatı hareket etmez. Bu kasıtlıdır.

Kesinlik ve taşma

  • Tüm eğri aritmetiği x * y üzerinde taşmayı önlemek için u128 ara değerlerini kullanır.
  • Bölme sıfıra doğru yuvarlanır, ancak SwapBaseOutput’un Δx_net yukarı yuvarlanır ve ücret hesaplaması trade_fee üzerinde yukarı ve alt bölünmelerde aşağı yuvarlanır. Bu yuvarlama yönleri, değişmezin tamsayı kesintisi nedeniyle asla azalmaması için seçilir.
  • Aşırı kasa oranlarına sahip havuzlar (milyarlar : 1) küçük işlemlerde kesinlik tabanlarına çarpabilir; program bu durumda ZeroTradingTokens döndürür. Bkz. reference/error-codes.

Sonraki adım

Kaynaklar: