Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Эта запись охватывает предстоящее обновление программы CPMM. Она была проверена на локальной ветке релиза (
0dde43d, 11 сентября 2026) перед развёртыванием. Перед использованием новых инструкций или изменённых списков аккаунтов убедитесь в развёрнутой программе.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 — две новые инструкции, один новый тип аккаунта, два изменённых списка аккаунтов, одно новое поле конфигурации.
Как работает разделение
Разрешение в порядке приоритета:- PDA
CreatorFeeShareв["creator_fee_share", creator, amm_config]— когда аккаунт существует и принадлежит CPMM, егоshare_rateпобеждает. 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 — две вставки:
Полные таблицы аккаунтов в
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просто имеет больше для сбора.- Коды ошибок.
6000–6015не изменены; ничего не добавлено. - Каждая другая инструкция и ID программы.
Обновлённые страницы
products/cpmm/fees— новый раздел «Доля протокола в комиссии создателя», охватывающий разрешение коэффициента, арифметику разделения, округление и последствия для интеграторов;creator_fee_share_rateдобавлен в список коэффициентов/единиц и таблицу параметров по умолчанию; таблица потока сбора переработана.products/cpmm/instructions— предупреждение о нарушении совместимости в начале; полные таблицы аккаунтов для обоих путей сбора комиссии создателя; новые разделыCreateCreatorFeeShareиCloseCreatorFeeShare; параметр8UpdateAmmConfig; примечание о порядке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 с другой базой.

