Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Эта запись охватывает предстоящее обновление программы CPMM. Она была проверена на локальной ветке релиза (0dde43d, 11 сентября 2026) перед развёртыванием. Перед использованием новых инструкций или изменённых списков аккаунтов убедитесь в развёрнутой программе.
Комиссия создателя в 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: 8creator_fee_share_rate.
  • Нет новых кодов ошибок. Новые пути переиспользуют InvalidOwner (6001), InvalidInput (6003) и MathOverflow (6011). 60006015 не изменены.
  • Требуется обновление 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 и оба проверяются на соответствие этому потолку. Затем для каждой стороны токена:
Три свойства, которые тесты программы закрепляют:
  • Округление благоприятствует создателю. Доля округляется вниз, поэтому пыль остаётся с создателем — то же направление, что и 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 не затронута.
Коэффициент читается при сборе, а не при накоплении. Комиссии, которые накопились, пока коэффициент был 0, рассчитываются по коэффициенту, действующему в момент, когда кто-то наконец вызывает Collect*. Нет снимка по эпохам или по свопам.

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

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

CreateCreatorFeeShare и CloseCreatorFeeShare

CreateCreatorFeeShare(share_rate: u64) инициализирует PDA; CloseCreatorFeeShare закрывает его и возвращает ренту подписывающему. Оба принимают общего администратора программы или выделенного владельца доли комиссии создателя — новую жёстко закодированную пару ключей, следующую тому же паттерну devnet/mainnet cfg, что и другие делегированные полномочия программы. Адреса в reference/program-addresses. Стоит отметить:
  • Создатель пула не является стороной ни одной инструкции и не подписывает. Аккаунт creator не проверяется — PDA может быть создан для ключа, который ещё не владеет пулом.
  • Один аккаунт охватывает пару (creator, amm_config), поэтому он управляет каждым пулом, которым владеет этот создатель на этом уровне комиссии. Создатель с пулами на двух уровнях нуждается в двух аккаунтах, чтобы быть охваченным на обоих.
  • Нет пути обновления. init не проходит при втором создании для той же пары; чтобы изменить коэффициент, закройте и пересоздайте.

Параметр 8 UpdateAmmConfig

Устанавливает долю по умолчанию для уровня комиссии. Это не связано с 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 просто имеет больше для сбора.
  • Коды ошибок. 60006015 не изменены; ничего не добавлено.
  • Каждая другая инструкция и 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-comparisoncreator_fee_share_rate выделен как четвёртый коэффициент CPMM с другой базой.