Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →

Две независимые комиссии, четыре направления

CPMM взимает две отдельно установленные комиссии на каждый своп:
  1. Торговая комиссия — взимается по ставке AmmConfig.trade_fee_rate и распределяется между тремя направлениями:
    • Доля LP — остаётся в хранилище и увеличивает k. Получается неявно при сжигании токенов LP.
    • Доля протокола — накапливается в PoolState.protocol_fees_token*; собирается protocol_owner через CollectProtocolFee.
    • Доля фонда — накапливается в PoolState.fund_fees_token*; собирается fund_owner через CollectFundFee.
  2. Комиссия создателя (опциональная, для каждого пула) — взимается по ставке AmmConfig.creator_fee_rate независимо от торговой комиссии и накапливается в PoolState.creator_fees_token*. Создатель может собрать её через CollectCreatorFee, или любой плательщик может запустить путь CollectCreatorFeePermissionless с ограничениями на направление. Активна только если пул был создан с enable_creator_fee = true. С обновления от 2026-09-13 накопленная комиссия создателя разделяется ещё раз во время сбора: настраиваемая доля переводится в протокольный бакет пула, и только остаток достаётся создателю — см. Доля протокола в комиссии создателя.
Комиссия создателя не является частью торговой комиссии. Две ставки складываются при взимании комиссии на входе своп, но каждая остаётся в своём бакете — доли протокола и фонда, взятые при своп, всегда берутся только из trade_fee, никогда из creator_fee. Пул с creator_fee_rate = 1000 (0,10%) и trade_fee_rate = 2500 (0,25%) взимает комбинированные 0,35% входа при своп с комиссией создателя на входе, из которых бакет создателя получает 0,10%, а бакет торговой комиссии получает 0,25%. Доля протокола в комиссии создателя работает в другую сторону и легко спутать с вышеизложенным: она вырезается из бакета создателя, а не из торговой комиссии, и не при своп — она применяется когда CollectCreatorFee или CollectCreatorFeePermissionless рассчитывает накопленный баланс. Математика своп не меняется. Ставки торговой комиссии (trade_fee_rate, protocol_fee_rate, fund_fee_rate), creator_fee_rate и стандартная creator_fee_share_rate находятся на AmmConfig. Флаг enable_creator_fee для каждого пула и режим creator_fee_on (с какой стороны своп берётся комиссия создателя) находятся на PoolState. Переопределение ставки доли для каждого создателя находится на отдельном PDA CreatorFeeShare. См. products/cpmm/accounts.

Ставки и единицы

Все ставки — это u64 в единицах 1 / FEE_RATE_DENOMINATOR, где FEE_RATE_DENOMINATOR = 1_000_000.
  • trade_fee_rate — доля объёма своп. 2500 ⇒ 0,25% соответствующей стороны (входа или выхода, в зависимости от creator_fee_on — см. раздел “С какой стороны своп берутся комиссии” ниже).
  • creator_fee_rate — доля объёма своп, взимается отдельно от торговой комиссии. 1000 ⇒ 0,10% соответствующей стороны.
  • protocol_fee_rate и fund_fee_rate — доли торговой комиссии, а не объёма. 120_000 ⇒ 12% торговой комиссии.
  • creator_fee_share_rate — доля накопленной комиссии создателя, не объёма и не торговой комиссии. 200_000 ⇒ 20% того, что находится в creator_fees_token* в момент сбора. 0 (по умолчанию) оставляет всю комиссию создателя создателю.
Параметры по умолчанию для AmmConfig[index=0] (стандартный пул 0,25%) на mainnet для справки: Итак, при своп на $1 000 против AmmConfig[0] с enable_creator_fee = false: $2,50 общей торговой комиссии, из которых $2,10 остаётся с LP, $0,30 идёт протоколу, $0,10 фонду. Бакет создателя равен 0, потому что комиссия создателя отключена. Если бы тот же пул имел enable_creator_fee = true и creator_fee_rate = 1000 (0,10%), пользователь платит дополнительно $1,00 в бакет создателя — взимается с той же стороны своп, настроенной creator_fee_on — всего $3,50 комиссий. Бакет торговой комиссии и его разделение протокол/фонд остаются неизменными. Проверьте текущие значения mainnet против GET https://api-v3.raydium.io/main/cpmm-config — ставки изменяются администратором и должны читаться свежими, а не жёстко кодироваться.

Разделение в коде

Примечания:
  • Общая комиссия на входе округляется вверх, поэтому пул никогда не недозаряжает.
  • Подразделения trade_fee (протокол, фонд) округляются вниз, поэтому их сумма никогда не превышает trade_fee; остаток — это доля LP.
  • lp_share = trade_fee − protocol_fee − fund_fee (creator_fee не вычитается здесь, потому что это собственный бакет).
  • Комиссия создателя берётся со входа или выхода в зависимости от PoolState.creator_fee_on (см. следующий раздел). Ставка остаётся неизменной в любом случае.

С какой стороны своп берутся комиссии

CPMM имеет параметр creator_fee_on для каждого пула (BothToken / OnlyToken0 / OnlyToken1), который определяет, берётся ли комиссия создателя со входа или выхода данного своп. Вспомогательная функция is_creator_fee_on_input(direction) сворачивает это в булево значение для каждого своп: Когда комиссия создателя находится на стороне входа, как торговая комиссия, так и комиссия создателя вычитаются из amount_in перед запуском кривой. Математика котировки: возьмите комбинированные trade_rate + creator_rate со входа. Когда комиссия создателя находится на стороне выхода, только торговая комиссия вычитается из amount_in; кривая производит выход без комиссии, затем комиссия создателя вычитается из этого выхода. Математика котировки: возьмите trade_rate со входа; возьмите creator_rate с выхода. Сама торговая комиссия всегда берётся со стороны входа (стандартный паттерн Uniswap-V2). Только комиссия создателя может приземлиться на выход.

Как “накопленные” комиссии взаимодействуют с кривой

Важный нюанс: комиссии протокола, фонда и создателя физически остаются в хранилище до вызова соответствующей инструкции Collect*. Но они исключены из представления кривой о балансе хранилища. Конкретная картина после одного своп:
Программа использует curve_x (и аналогичный curve_y) при проверке k' ≥ k. Это то, как комиссии, не относящиеся к LP, достигают своих направлений без увеличения доли LP в пуле. Последствия, которые вы должны учитывать при проектировании:
  • Котировка по сырым балансам неправильна. Если вы построите котировщик на основе getTokenAccountBalance, вы будете постоянно переоценивать цену, которую пул будет соблюдать. Всегда вычитайте накопленные комиссии или моделируйте через SwapBaseInput / API.
  • CollectProtocolFee не движет цену. Он перемещает токены из хранилища и обнуляет счётчики protocol_fees_token*, поэтому curve_x и curve_y остаются неизменными.
  • Комиссии LP не накапливаются в счётчик. Они неявны в балансе хранилища. Право LP на накопленные комиссии LP осуществляется путём сжигания токенов LP (т. е. через Withdraw) — нет CollectLpFee.

Взаимодействие с комиссиями передачи Token-2022

Комиссии передачи Token-2022 применяются монетой, а не CPMM. Они действуют на каждую передачу токенов — своп, депозит, вывод и сборки Collect*. Математика торговой комиссии CPMM вычисляется против суммы, которая фактически попала в хранилище, т. е. за вычетом комиссии передачи входной монеты (если есть). Итак, в худшем случае пользователь платит три отдельных налога при своп с точным входом:
  1. Комиссия передачи входной монеты на amount_in (органу сбора комиссий монеты).
  2. Комиссия пула trade_fee на остаток (разделена как выше).
  3. Комиссия передачи выходной монеты на amount_out (органу сбора комиссий монеты).
Котировщик SDK учитывает все три, поэтому minimum_amount_out выражается в том, что пользователь фактически получает. Если вы пишете свой собственный котировщик, отразите это поведение, иначе ваши проверки проскальзывания будут систематически слишком щедрыми. См. algorithms/token-2022-transfer-fees для подробного вывода.

Комиссия создателя

Комиссия создателя опциональна и для каждого пула. Ставка находится на AmmConfig.creator_fee_rate; флаг включения и сторона (creator_fee_on) находятся на PoolState:
  • Включена при создании пула. Initialize устанавливает enable_creator_fee = false по умолчанию; пулы, созданные через InitializeWithPermission (используется выпускниками LaunchLab и другими закрытыми путями), могут передать enable_creator_fee = true и выбрать creator_fee_on.
  • Ставка общая с уровнем комиссии. Сама ставка — это AmmConfig.creator_fee_rate, одно и то же значение для каждого пула, привязанного к этой конфигурации. Каждый пул затем решает, взимать ли её (enable_creator_fee) и с какой стороны своп взимать (creator_fee_on). Когда enable_creator_fee = false, эффективная ставка комиссии создателя пула равна нулю независимо от значения конфигурации (см. PoolState::adjust_creator_fee_rate в исходном коде).
  • Независима от торговой комиссии. Комиссия создателя никогда не уменьшает доли LP / протокол / фонд — это собственная ставка, применяемая отдельно, накапливаемая в собственных счётчиках.
  • Собирается через CollectCreatorFee или CollectCreatorFeePermissionless. Исходный путь требует подписи PoolState.pool_creator. Путь без разрешения позволяет любому плательщику запустить сбор, но фиксирует оба направления на канонических ATA создателя. Оба пути сначала рассчитывают долю протокола — см. следующий раздел.
  • Не может быть повторно включена или переведена после создания. Пул, инициализированный с enable_creator_fee = false, никогда не будет взимать комиссию создателя; инициализированный с конкретным creator_fee_on не может переключать стороны.
Комиссии создателя — это механизм, стоящий за паттерном Raydium “Burn & Earn”: токены LP заблокированы в программе LP Lock, поэтому создатель не может вывести ликвидность, но накопленные комиссии создателя всё ещё могут собираться бесконечно.

Доля протокола в комиссии создателя

С обновления от 2026-09-13 протокол может сохранить настраиваемую долю комиссии создателя. Ничего в своп не меняется: комиссия создателя по-прежнему взимается по creator_fee_rate и по-прежнему полностью накапливается в creator_fees_token{0,1}. Разделение происходит один раз, во время сбора, внутри CollectCreatorFee и CollectCreatorFeePermissionless.

Откуда берётся ставка

Два источника, в порядке приоритета:
  1. PDA CreatorFeeShare — семена ["creator_fee_share", creator, amm_config]. Когда этот счёт существует и принадлежит CPMM, его share_rate побеждает. Это позволяет протоколу согласовать ставку для каждого создателя на данном уровне комиссии без изменения самого уровня.
  2. AmmConfig.creator_fee_share_rate — по умолчанию для каждого создателя на этом уровне комиссии. Используется всякий раз, когда PDA не существует.
Оба — это u64 над тем же FEE_RATE_DENOMINATOR = 1_000_000, и оба ограничены знаменателем. Инструкции сбора всегда берут счёт creator_fee_share, даже если он никогда не был создан — программа проверяет, пуст ли он, и откатывается к конфигурации. Передача неправильного адреса не проходит ограничение PDA, а не откат.

Что делает разделение

Применяется независимо к creator_fees_token_0 и creator_fees_token_1, затем:
  • creator_amount_{0,1} передаётся из хранилищ на счета токенов создателя.
  • shared_amount_{0,1} добавляется к protocol_fees_token_{0,1} и остаётся в хранилище до тех пор, пока владелец протокола не соберёт его с помощью CollectProtocolFee. Нет отдельной инструкции и нет отдельного счётчика для неё.
  • creator_fees_token_{0,1} обнуляются, точно как раньше.
Три свойства, на которые стоит полагаться:
  • Округление благоприятствует создателю. Доля протокола округляется вниз, поэтому пыль остаётся с создателем — то же направление, что и protocol_fee и fund_fee, которые также вырезают долю из уже накопленной комиссии.
  • Значение сохраняется. creator_amount + shared_amount == creator_fee для каждой ставки и каждой комиссии, включая u64::MAX.
  • share_rate = 0 — это холостой ход. Как стандартное значение конфигурации, так и отсутствие PDA CreatorFeeShare оставляют всю комиссию создателя создателю, что является поведением до обновления.

Что это означает для интеграторов

  • LP и котировка не затронуты. Общая сумма перемещается между двумя счётчиками, которые оба уже исключены из представления кривой о хранилище (vault_amount_without_fee), поэтому curve_x и curve_y не движутся при сборке. k не затронут.
  • Оценщик комиссии создателя, который читает creator_fees_token*, теперь переоценивает выплату. Умножьте на (1 − share_rate / 1_000_000), используя ставку, которая фактически применяется к этой паре (creator, amm_config), а не стандартную конфигурацию.
  • protocol_fees_token* растёт вне своп. Монитор, который согласует накопление протокола с объёмом своп, увидит скачки при каждом сборе комиссии создателя. Накопление протокола больше не только trade_fee × protocol_fee_rate.
  • Ставка может измениться между накоплением и сбором. Она читается во время сбора, поэтому комиссии, которые накопились под одной ставкой, рассчитываются по любой ставке, которая действует, когда кто-то вызывает Collect*.
Счёт CreatorFeeShare создаётся и закрывается администратором или выделенным органом управления долей комиссии создателя через CreateCreatorFeeShare / CloseCreatorFeeShare; закрытие его возвращает пару к AmmConfig.creator_fee_share_rate. Макет счёта в products/cpmm/accounts, адреса в reference/program-addresses.

Операционный поток сбора

Владельцы протокола и фонда — это мультиподпись Raydium на mainnet; см. security/admin-and-multisig. На исходном пути только для создателя подписант создателя — это счёт, записанный в PoolState. На пути без разрешения вызывающий платит за создание любого отсутствующего ATA создателя. Программа ограничивает creator до pool_state.pool_creator и выводит каждое направление из этого создателя плюс соответствующая монета хранилища и программа токенов, поэтому вызывающий не может перенаправить средства.

Изменение уровня комиссии

Ставки комиссии могут быть изменены администратором через UpdateAmmConfig (см. products/cpmm/instructions). Изменения вступают в силу при следующем своп для каждого пула, привязанного к этому AmmConfig — нет миграции, потому что пулы загружают конфигурацию при каждом своп. Что администратор не может сделать:
  • Переместить пул из одного AmmConfig в другой.
  • Переоценить уже накопленные комиссии задним числом.
  • Собрать комиссии без подписи protocol_owner / fund_owner.

Чтение комиссий из работающего пула

Разрешите ставку доли on-chain, а не из кэшированной конфигурации. creator_fee_share_rate — это недавно добавленное поле AmmConfig, поэтому читайте его со счёта, а не предполагайте, что полезная нагрузка конфигурации REST его несёт, и проверьте, существует ли PDA CreatorFeeShare в ["creator_fee_share", creator, ammConfig] перед котировкой создателю его выплаты. Отсутствующий PDA — это обычный случай и означает, что применяется стандартная конфигурация.

Сравнение с CLMM и AMM v4

См. reference/fee-comparison для матрицы рядом. Резюме:
  • AMM v4 использует фиксированную торговую комиссию 0,25% с другим разделением LP/протокол и без комиссии фонда.
  • CLMM комиссии — это уровень интервала тиков, накапливаются для каждой позиции (не для каждого пула) и получаются через DecreaseLiquidity или CollectFees.

Куда дальше

  • products/cpmm/math — где вычитание торговой комиссии подключается к кривой.
  • products/cpmm/instructions — списки счётов инструкции Collect*, включая счёт creator_fee_share, который теперь требуют оба пути создателя.
  • algorithms/token-2022-transfer-fees — как правильно объединить комиссию своп пула с комиссией передачи монеты.
Источники: