> ## Documentation Index
> Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
> Use this file to discover all available pages before exploring further.

# AMM v4 matematik

> Sabit-çarpım değişmezi, AMM v4'ün ücret kuralı, rezervden emir defterine fiyat dönüşümü, hedef-emir ızgarası oluşturma ve PnL kapatma adımı.

<Info>
  **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 →](/products/amm-v4/math)
</Info>

## Değişmez

Pool `coin_reserve × pc_reserve = k` ilişkisini korur; burada (2026-07 OpenBook kaldırılmasından sonra):

```
coin_reserve = coin_vault_balance - accrued_pnl_coin
pc_reserve   = pc_vault_balance   - accrued_pnl_pc
```

Dikkat edilmesi gereken iki nokta:

1. Rezervler artık **yalnızca vault'tur**. Tarihsel açık-emir terimi (pool'un OpenBook limit emirleri olarak emanet ettiği tokenlar) kaldırılmıştır — kaldırılmadan çok önce pratikte sıfırdı. `k`'yi doğrudan zincir üstü vault bakiyelerinden hesaplayabilirsiniz.
2. PnL birikimi (`need_take_pnl_*`) çıkarılır, böylece admin ücretleri topladığında eğri korunur. CPMM'nin `protocol_fees_*` hariç tutulması ile aynı ilke.

Program bunu `calc_total_without_take_pnl_no_orderbook` aracılığıyla hesaplar (eski emir defteri farkında olan varyant ortadan kaldırılmıştır).

Her `Swap*` işlemi, LP'nin ücret payı rezervlere geri eklendikten sonra `k' ≥ k` olmasını zorunlu kılar.

## Ücret kuralı

AMM v4, CPMM / CLMM'nin `1/1_000_000` kuralı yerine **oran ücretleri** (pay/payda çiftleri) kullanır. Zincir üstü `Fees` yapısı (program kaynağında [`Fees::initialize`](https://github.com/raydium-io/raydium-amm/blob/master/program/src/state.rs) bölümüne bakın) varsayılan olarak:

```
Fees {
  min_separate_numerator:    5,
  min_separate_denominator:  10_000,   //  5/10_000 = 0.05%

  trade_fee_numerator:      25,
  trade_fee_denominator:    10_000,    // 25/10_000 = 0.25% — OpenBook limit-emir fiyatlandırması için kullanılır

  pnl_numerator:            12,
  pnl_denominator:          100,       // 12/100   = 12%   — swap ücretinin protokol payı

  swap_fee_numerator:       25,
  swap_fee_denominator:     10_000,    // 25/10_000 = 0.25% — AMM-yolu swaplarında brüt ücret
}
```

Yorumlama (yayınlanan mainnet varsayılanları):

* **Toplam swap ücreti:** `swap_fee = amount_in × 25 / 10_000 = 0.25%` brüt girdinin.
* **Protokol payı:** `pnl_numerator / pnl_denominator = 12 / 100 = 12%` **swap ücretinin**, bu da `0.25% × 12% = 0.03%` hacim anlamına gelir. Bu pay PnL sayaçlarına birikir ve `WithdrawPnl` tarafından toplanır.
* **LP payı:** swap ücretinin kalan `88%`'i, bu da `0.25% × 88% = 0.22%` hacim anlamına gelir. Pool'da kalır ve `k`'yi şişirir.
* **Fon payı yok.** AMM v4'ün CPMM/CLMM fon-ücret bölünmesi yoktur.

`pnl_numerator / pnl_denominator`'ın ticaret hacminin değil, ücretin bir kesri olduğuna dikkat edin — bu alan adlarının yaygın bir yanlış okuması.

`trade_fee_numerator / trade_fee_denominator` (ayrıca `25 / 10_000`) tarihsel olarak OpenBook entegrasyonu tarafından AMM'nin limit-emir ızgarası için ücret dahil fiyatlar hesaplanırken kullanılmıştır. OpenBook kodu kaldırıldığında, bu alan kalıntıdır; etkin swap ücreti `swap_fee_*`'dir.

Bu varsayılanlardan sapmalar nadirdir ancak birkaç eski pool'da mevcuttur; her zaman `AmmInfo.fees`'ten ücretleri okuyun.

## Doğrudan swap matematik (AMM yolu)

En basit durum: kullanıcı OpenBook ile etkileşime girmeden pool'un vault'larına karşı swap yapar. Pool'un iç rezervleri (kitap üstü tahsisatlar dahil) paydadır.

**SwapBaseIn (tam giriş):**

```
amount_after_fee = amount_in − ceil(amount_in × swap_fee_numerator / swap_fee_denominator)
amount_out = amount_after_fee × out_reserve
           / (in_reserve + amount_after_fee)
require(amount_out >= minimum_amount_out)
```

Burada kullanılan rezervler vault bakiyeleridir (birikmiş PnL eksi). Tarihsel olarak formül ayrıca AMM'nin OpenBook emirlerine kilitlenmiş tokenları eklemiştir; **bu terim kaldırılmıştır** — etkili rezervler artık ham vault bakiyeleri eksi bekleyen PnL'ye eşittir. OpenBook tarafını yenileyen `MonitorStep` / örtülü kapatma yolu kaldırılmıştır.

**SwapBaseOut (tam çıkış):**

```
amount_in_after_fee = ceil(in_reserve × amount_out / (out_reserve − amount_out))
amount_in_gross     = ceil(amount_in_after_fee × swap_fee_denominator
                            / (swap_fee_denominator − swap_fee_numerator))
require(amount_in_gross <= maximum_amount_in)
```

## Emir defteri etkileşimi (tarihsel)

<Note>
  **Kaldırıldı.** Bu bölümde açıklanan ızgara oluşturma, AMM v4'ün orijinal olarak eğriyi bir OpenBook pazarına nasıl yansıttığını yansıtır. OpenBook entegrasyonu — `MonitorStep` krankı ve `build_orders` ızgara mantığı dahil — programdan **kaldırılmıştır** (2026-07 yükseltmesi). Aşağıdaki matematik, zincir üstü `target_orders` / `amm_open_orders` hesaplarının bir zamanlar ne kadar boyutlandırıldığı için tamamen tarihsel bağlam olarak korunmuştur.
</Note>

Kullanıcı swaplarından ayrı olarak, AMM v4 tarihsel olarak OpenBook pazarına bir **ızgara** limit emirleri yerleştirmiştir. Izgara `AmmInfo` parametrelerinden hesaplanmıştır:

* **`depth`** — taraf başına fiyat seviyeleri sayısı.
* **`amount_wave`** — seviye başına boyut temel birimi.
* **`min_size`**, **`coin_lot_size`**, **`pc_lot_size`** — OpenBook pazarı kısıtlamaları.
* **`state_data.swap_acc_coin_fee`**, **`swap_acc_pc_fee`** — son `TakePnl`'den bu yana kümülatif ücret sayaçları.

Program, mevcut eğri fiyatından sabit oran adımlarında yürüyerek seviye başına fiyatları türetir:

```
price_level(k) = curve_price × (1.0001 ^ k)       # kavramsal olarak
size_level(k)  = amount_wave × f(depth, k)        # derinlik tarafından daraltılmış
```

Tam fiyatlar ve boyutlar `build_orders`'da hesaplanan `target_orders` tarafından belirlenir ve her `MonitorStep`'te `amm_open_orders` ile karşılaştırılır. Herhangi bir sapma, iptal + yeni gönderiler ile sonuçlanır. OpenBook'ta yeni doldurulmuş emirler, OpenBook tarafını yenileyen bir sonraki işlemde pool vault'larına kapatılır.

Entegratörler nadiren ızgarayı hesaplaması gerekir — Raydium bekçisi bunu korur — ancak şunu bilmek faydalıdır:

* Önemli **kitap üstü** likiditeye sahip bir pool, bu likiditenin `k`'ye katkı sağladığını, boşta oturmadığını gösterir.
* Eski bir OpenBook pazarı (olay sırası dolu, kranklar engellendi) ızgara güncellemelerini engeller; AMM daha sonra bir sonraki kranka kadar görünür emir defterinden sapan fiyatları alıntılayabilir.

## Kapatma adımı (PnL)

0.03% protokol payı `state_data.need_take_pnl_coin` ve `state_data.need_take_pnl_pc`'ye birikir. `TakePnl` bu tutarları vault'lardan admin tarafından belirtilen hedefe taşır, ardından sayaçları sıfırlar.

Kritik özellik: değişmezdeki rezervler her zaman **eksi** birikmiş PnL olarak hesaplanır, bu nedenle `TakePnl` eğriyi hareket ettirmez. Bu CPMM kuralı ile eşleşir.

## Çalışılmış örnek

Pool durumu:

* `coin_reserve = 1_000_000_000_000` (1.000.000 coin tarafı; 6 ondalık)
* `pc_reserve   = 2_000_000_000_000` (2.000.000 pc tarafı; 6 ondalık)
* Ücretler: varsayılan `swap = 25/10_000`, `pnl = 3/10_000`.

Kullanıcı: `SwapBaseIn` tam-giriş `1_000_000_000` coin (1.000 coin).

```
swap_fee        = ceil(1_000_000_000 * 25 / 10_000)    = 2_500_000
amount_after_fee =                                      997_500_000

amount_out = amount_after_fee * pc_reserve
           / (coin_reserve + amount_after_fee)
           = 997_500_000 * 2_000_000_000_000
           / (1_000_000_000_000 + 997_500_000)
           ≈ 1_995_015_009  (1.995,015 pc)

// 2_500_000 swap ücretinin:
pnl_share = 2_500_000 * 3 / 25  = 300_000    (protokole need_take_pnl_coin aracılığıyla gider)
lp_share  = 2_500_000 * 22 / 25 = 2_200_000  (coin_reserve'de kalır)

new coin_reserve = 1_000_000_000_000 + 1_000_000_000                 = 1_001_000_000_000
                   (bunun 300_000'i birikmiş PnL'dir)
  curve coin_reserve = 1_001_000_000_000 − 300_000 = 1_000_999_700_000
new pc_reserve   = 2_000_000_000_000 − 1_995_015_009                 ≈ 1_998_004_984_991

k' = curve_coin_reserve * new_pc_reserve
   ≈ 2.000_002_701E24
k  = 1_000_000_000_000 * 2_000_000_000_000
   = 2.0E24
k' > k   ✓
```

LP payı (`2_200_000`) hiçbir yerde ayrılmaz — `k`'yi yükselten kalıntıdır.

## Kesinlik kuralları

* Rezerv çarpımları `u128` kullanır; son bölmeler sıfıra doğru yuvarlanır.
* `swap_fee` yukarı yuvarlanır (pool'un az ücret almaması için).
* `SwapBaseOut` için `amount_in` yukarı yuvarlanır (kullanıcı az ödeme yapmaması için).
* Aşırı rezerv oranlarına sahip pool'lar çok küçük girdilerde `ZeroTradingTokens`'a çarpabilir; CPMM ile aynı kural.

## CPMM'ye karşı sınırlamalar

* AMM v4'ün rezervleri artık yalnızca vault'tur, bu nedenle vault bakiyelerinden doğrudan alıntı yapabilirsiniz (eksi `need_take_pnl_*`) — `open_orders.free` / `open_orders.locked` tutarlarını ekleme önceki gereksinimi artık geçerli değildir. SDK / API alıntısı en basit seçenek olmaya devam eder.
* AMM v4 yapılandırılmış zincir üstü TWAP'ı açığa çıkarmaz. AMM-v4 destekli bir fiyat isteyen harici tüketiciler bunu ticaret günlüklerinden kendileri hesaplamalıdır.
* Token-2022 desteklenmez.

## Sonraki adım

* [`products/amm-v4/instructions`](/tr/products/amm-v4/instructions) — `SwapBaseIn`, `Deposit` vb. nereye bağlanır.
* [`products/amm-v4/fees`](/tr/products/amm-v4/fees) — tam ücret mekaniği, `TakePnl` detayları.
* [`algorithms/constant-product`](/tr/algorithms/constant-product) — paylaşılan türetme.

Kaynaklar:

* [Raydium AMM program kaynağı — `raydium-io/raydium-amm`](https://github.com/raydium-io/raydium-amm)
* Raydium SDK v2 `Liquidity` modülü
