> ## 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.

# 2026-09-13 — CPMM: протокол получает долю комиссии создателя

> CPMM теперь может удерживать настраиваемую долю комиссии создателя, применяемую при сборе комиссии, а не при её начислении. AmmConfig получает creator_fee_share_rate (вырезано из padding, того же размера), новый PDA CreatorFeeShare переопределяет его для каждого создателя, а CreateCreatorFeeShare / CloseCreatorFeeShare управляют им. Обе версии CollectCreatorFee меняют списки аккаунтов — это нарушает совместимость с существующими клиентами. UpdateAmmConfig получает параметр 8. Нет новых кодов ошибок, PoolState не изменяется, математика свопов не затронута.

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/reference/changelog/2026-09-13-cpmm-creator-fee-protocol-share)
</Info>

<Info>
  Эта запись охватывает предстоящее обновление программы CPMM. Она была проверена на локальной ветке релиза (`0dde43d`, 11 сентября 2026) перед развёртыванием. Перед использованием новых инструкций или изменённых списков аккаунтов убедитесь в развёрнутой программе.
</Info>

Комиссия создателя в CPMM всегда полностью переходила создателю пула. Этот релиз позволяет протоколу удерживать её долю — согласованную по уровню комиссии или по создателю на уровне комиссии — без изменения способа начисления комиссии.

Выбор дизайна, который минимизирует область воздействия: **разделение происходит при сборе, а не при свопе.** Своп по-прежнему начисляет `creator_fee_rate` и по-прежнему накапливает всю сумму в `creator_fees_token_{0,1}`. Когда запускается `CollectCreatorFee` или `CollectCreatorFeePermissionless`, накопленный баланс делится, доля протокола переклассифицируется как комиссия протокола в том же пуле, и только доля создателя покидает хранилище. Котировки, кривая, `k` и все пути, видимые LP, не затронуты.

## TL;DR для интеграторов

* **Обе инструкции сбора комиссии создателя изменили списки аккаунтов. Это нарушает совместимость.** `CollectCreatorFee` получает `creator_fee_share` в позицию 5. `CollectCreatorFeePermissionless` получает `amm_config` в позицию 5 и `creator_fee_share` в позицию 6. Обе вставки находятся перед хранилищами, поэтому всё остальное смещается. Пересоберите эти транзакции; не патчьте их.
* **`creator_fee_share` должен быть передан даже если он не существует.** Он объявлен с ограничением seed, но читается как непроверенный аккаунт, поэтому адрес должен быть каноническим PDA в `["creator_fee_share", creator, amm_config]`, в то время как сам аккаунт опционален. Когда он пуст, программа возвращается к `AmmConfig.creator_fee_share_rate`.
* **`AmmConfig` получает `creator_fee_share_rate`, вырезанный из padding.** Аккаунт по-прежнему **236 байт** и каждая существующая конфигурация продолжает десериализоваться — но первый `u64` старого `padding: [u64; 15]` теперь является активным полем. Декодеры, которые моделируют хвост как массив из 15 элементов, читают коэффициент доли как `padding[0]`.
* **`PoolState` не изменяется.** 637 байт, те же смещения, те же поля. Доля протокола учитывается в существующих счётчиках `protocol_fees_token_{0,1}` — нет нового счётчика и нет новой инструкции сбора для него.
* **`protocol_fees_token*` теперь растёт вне свопов.** Любой монитор, который согласует накопление протокола с объёмом торговли, увидит скачки при каждом сборе комиссии создателя.
* **Оценка выплат создателю, которая читает `creator_fees_token*`, теперь завышает.** Умножьте на `(1 − share_rate / 1_000_000)`, разрешённое для этой пары `(creator, amm_config)`.
* **Добавлены две инструкции администратора:** `CreateCreatorFeeShare` и `CloseCreatorFeeShare`. **Один новый параметр `UpdateAmmConfig`:** `8` → `creator_fee_share_rate`.
* **Нет новых кодов ошибок.** Новые пути переиспользуют `InvalidOwner` (`6001`), `InvalidInput` (`6003`) и `MathOverflow` (`6011`). `6000`–`6015` не изменены.
* **Требуется обновление IDL** — две новые инструкции, один новый тип аккаунта, два изменённых списка аккаунтов, одно новое поле конфигурации.

## Как работает разделение

Разрешение в порядке приоритета:

1. **PDA `CreatorFeeShare`** в `["creator_fee_share", creator, amm_config]` — когда аккаунт существует и принадлежит CPMM, его `share_rate` побеждает.
2. **`AmmConfig.creator_fee_share_rate`** — значение по умолчанию для уровня комиссии, используется в противном случае.

Оба являются `u64` над `FEE_RATE_DENOMINATOR_VALUE = 1_000_000` и оба проверяются на соответствие этому потолку. Затем для каждой стороны токена:

```rust theme={null}
// states/creator_fee_share.rs
shared_amount  = floor(creator_fee * share_rate / 1_000_000);
creator_amount = creator_fee - shared_amount;
```

```rust theme={null}
// states/pool.rs — PoolState::settle_creator_fee
self.protocol_fees_token_i = self.protocol_fees_token_i.checked_add(shared_amount_i)?;
self.creator_fees_token_i  = 0;
// creator_amount_i возвращается и переводится создателю
```

Три свойства, которые тесты программы закрепляют:

* **Округление благоприятствует создателю.** Доля округляется вниз, поэтому пыль остаётся с создателем — то же направление, что и `Fees::protocol_fee` и `Fees::fund_fee`, которые также вырезают долю из уже накопленной комиссии. 20% комиссии в 1 единицу — это 0, а не 1.
* **Стоимость сохраняется.** `creator_amount + shared_amount == creator_fee` для каждого коэффициента и каждой комиссии вплоть до `u64::MAX`.
* **`share_rate = 0` — это ровно старое поведение.** И значение конфигурации по умолчанию, и отсутствующий PDA дают создателю всю комиссию, поэтому ничего не меняется для любого существующего пула, пока администратор не установит коэффициент.

Поскольку `protocol_fees_token*` и `creator_fees_token*` уже вычитаются в `vault_amount_without_fee`, перемещение стоимости между ними не меняет представление кривой о хранилище. Ни один LP не видит изменения цены при сборе комиссии создателя, и проверка `k` не затронута.

<Note>
  **Коэффициент читается при сборе, а не при накоплении.** Комиссии, которые накопились, пока коэффициент был `0`, рассчитываются по коэффициенту, действующему в момент, когда кто-то наконец вызывает `Collect*`. Нет снимка по эпохам или по свопам.
</Note>

## Изменения списков аккаунтов

`CollectCreatorFee` — одна вставка:

| #   | До                                                 | После                                            |
| --- | -------------------------------------------------- | ------------------------------------------------ |
| 1–4 | `creator`, `authority`, `pool_state`, `amm_config` | без изменений                                    |
| 5   | `token_0_vault`                                    | **`creator_fee_share`** (новый)                  |
| 6.. | —                                                  | `token_0_vault` и всё остальное, смещено на один |

`CollectCreatorFeePermissionless` — две вставки:

| #   | До                                            | После                                           |
| --- | --------------------------------------------- | ----------------------------------------------- |
| 1–4 | `payer`, `creator`, `authority`, `pool_state` | без изменений                                   |
| 5   | `token_0_vault`                               | **`amm_config`** (новый)                        |
| 6   | `token_1_vault`                               | **`creator_fee_share`** (новый)                 |
| 7.. | —                                             | `token_0_vault` и всё остальное, смещено на два |

<Warning>
  Ни одно из изменений не вызывает ошибку полезным способом. Вставленные аккаунты находятся не в конце списка, поэтому старый клиент не «пропускает аккаунт» — он передаёт программе хранилище там, где ожидается конфигурация, и транзакция не проходит при десериализации. Пересоберите из нового IDL и убедитесь, что любой выпуск SDK, который вы закрепляете, содержит новые аккаунты перед указанием на обновлённую программу.
</Warning>

Полные таблицы аккаунтов в [`products/cpmm/instructions`](/ru/products/cpmm/instructions#collectcreatorfee).

## `CreateCreatorFeeShare` и `CloseCreatorFeeShare`

```rust theme={null}
pub struct CreatorFeeShare {
    pub bump: u8,
    pub creator: Pubkey,
    pub amm_config: Pubkey,
    pub share_rate: u64,
    pub padding: [u64; 8],
}
// CreatorFeeShare::LEN == 145
```

`CreateCreatorFeeShare(share_rate: u64)` инициализирует PDA; `CloseCreatorFeeShare` закрывает его и возвращает ренту подписывающему. Оба принимают общего администратора программы **или** выделенного владельца доли комиссии создателя — новую жёстко закодированную пару ключей, следующую тому же паттерну devnet/mainnet `cfg`, что и другие делегированные полномочия программы. Адреса в [`reference/program-addresses`](/ru/reference/program-addresses#cpmm-creator-fee-share-authority).

Стоит отметить:

* **Создатель пула не является стороной ни одной инструкции** и не подписывает. Аккаунт `creator` не проверяется — PDA может быть создан для ключа, который ещё не владеет пулом.
* **Один аккаунт охватывает пару `(creator, amm_config)`**, поэтому он управляет каждым пулом, которым владеет этот создатель на этом уровне комиссии. Создатель с пулами на двух уровнях нуждается в двух аккаунтах, чтобы быть охваченным на обоих.
* **Нет пути обновления.** `init` не проходит при втором создании для той же пары; чтобы изменить коэффициент, закройте и пересоздайте.

## Параметр 8 `UpdateAmmConfig`

```rust theme={null}
Some(8) => update_creator_fee_share_rate(amm_config, value),   // asserts value <= 1_000_000
```

Устанавливает долю по умолчанию для уровня комиссии. Это не связано с `protocol_fee_rate` (параметр `1`), который разделяет **торговую** комиссию — момент, на который стоит обратить внимание в инструментах администратора, поскольку оба выглядят похоже и оба попадают в `protocol_fees_token*`.

## Попутные изменения

**Исправление порядка `CollectExcessLamports`.** Инструкция теперь делает два прохода по `remaining_accounts` — сначала каждый CPI программы токенов, затем прямые дебеты PDA, принадлежащих CPMM — вместо отправки в порядке вызывающего. Чередование двух прерывалось с `UnbalancedInstruction` времени выполнения («сумма балансов аккаунтов до и после инструкции не совпадают») всякий раз, когда PDA дебетовался перед CPI, потому что ожидающие изменения лампортов вызывающего сбрасываются в аккаунты только CPI, который фактически переносит. Интерфейс инструкции не изменяется; вызывающие по-прежнему передают источники в любом порядке, и теперь это действительно безопасно.

**Метаданные проверяемой сборки.** Рабочее пространство `Cargo.toml` объявляет `[workspace.metadata.cli] solana = "3.1.10"`, поэтому проверяемая сборка разрешает тот же Solana CLI, против которого была собрана программа. Нет эффекта в цепи.

## Что не изменилось

* **`PoolState`** — 637 байт, те же поля, те же смещения. Доля протокола переиспользует существующий протокольный счёт вместо добавления собственных счётчиков.
* **`AmmConfig::LEN`** — по-прежнему 236 байт.
* **Математика свопов, котировки и проверка `k`.** Комиссия создателя начисляется ровно как раньше.
* **`CollectProtocolFee` / `CollectFundFee`** — те же аккаунты, те же подписывающие. `CollectProtocolFee` просто имеет больше для сбора.
* **Коды ошибок.** `6000`–`6015` не изменены; ничего не добавлено.
* **Каждая другая инструкция** и ID программы.

## Обновлённые страницы

* `products/cpmm/fees` — новый раздел «Доля протокола в комиссии создателя», охватывающий разрешение коэффициента, арифметику разделения, округление и последствия для интеграторов; `creator_fee_share_rate` добавлен в список коэффициентов/единиц и таблицу параметров по умолчанию; таблица потока сбора переработана.
* `products/cpmm/instructions` — предупреждение о нарушении совместимости в начале; полные таблицы аккаунтов для обоих путей сбора комиссии создателя; новые разделы `CreateCreatorFeeShare` и `CloseCreatorFeeShare`; параметр `8` `UpdateAmmConfig`; примечание о порядке `CollectExcessLamports`; строки сводки и матрицы изменения состояния.
* `products/cpmm/accounts` — новый раздел аккаунта `CreatorFeeShare`; макет `AmmConfig` и предупреждение о вырезании padding; примечания счётчика комиссии `PoolState`; строки жизненного цикла аккаунта.
* `products/cpmm/overview` — выноска комиссии создателя и пункт «Предсказуемые комиссии».
* `products/cpmm/math` — примечание о том, что разделение намеренно отсутствует в математике свопов.
* `products/cpmm/code-demos` — предупреждение о том, что построители SDK перед обновлением выдают старые списки аккаунтов; фрагмент накопленной комиссии аннотирован.
* `reference/program-addresses` — новый раздел «Полномочия доли комиссии создателя CPMM»; `creator_fee_share` добавлен в блок seed PDA.
* `reference/fee-comparison` — `creator_fee_share_rate` выделен как четвёртый коэффициент CPMM с другой базой.
