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.
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Две независимые комиссии, четыре получателя
CPMM взимает две отдельно рассчитанные комиссии при каждом своп:- Торговая комиссия — взимается по ставке
AmmConfig.trade_fee_rateи распределяется между тремя получателями:- Доля LP — остаётся в хранилище и увеличивает
k. Запрашивается неявно путём сжигания LP-токенов. - Доля протокола — накапливается в
PoolState.protocol_fees_token*; собираетсяprotocol_ownerчерезCollectProtocolFee. - Доля фонда — накапливается в
PoolState.fund_fees_token*; собираетсяfund_ownerчерезCollectFundFee.
- Доля LP — остаётся в хранилище и увеличивает
- Комиссия создателя (опционально, для каждого пула) — взимается по ставке
AmmConfig.creator_fee_rateнезависимо от торговой комиссии, накапливается вPoolState.creator_fees_token*, собираетсяpool_state.pool_creatorчерезCollectCreatorFee. Активна только если пул был создан сenable_creator_fee = true.
trade_fee, никогда из creator_fee. Пул с creator_fee_rate = 1000 (0,10%) и trade_fee_rate = 2500 (0,25%) взимает суммарно 0,35% входа при своп с комиссией создателя на входе, из которых создатель получает 0,10% а торговая комиссия занимает 0,25%.
Ставки торговой комиссии (trade_fee_rate, protocol_fee_rate, fund_fee_rate) и creator_fee_rate находятся на AmmConfig. Флаг enable_creator_fee для каждого пула и режим creator_fee_on (с какой стороны своп берётся комиссия создателя) находятся на PoolState. См. 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% торговой комиссии.
AmmConfig[index=0] (пула “стандартный” 0,25%) на mainnet для справки:
| Поле | Значение | Эффективный процент |
|---|---|---|
trade_fee_rate | 2500 | 0,25% объёма (корзина торговой комиссии) |
protocol_fee_rate | 120000 | 12% торговой комиссии ≈ 0,030% объёма |
fund_fee_rate | 40000 | 4% торговой комиссии ≈ 0,010% объёма |
creator_fee_rate | 0 (по умолчанию) | 0% (отдельная корзина) |
| → Эффективная доля LP | 0,210% объёма |
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) сводит это к логическому значению для каждого своп:
creator_fee_on | Своп 0 → 1 | Своп 1 → 0 |
|---|---|---|
BothToken (0) | сторона входа | сторона входа |
OnlyToken0 (1) | сторона входа | сторона выхода |
OnlyToken1 (2) | сторона выхода | сторона входа |
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 вычисляется на сумме, которая фактически приземлилась в хранилище, т.е. за вычетом комиссии передачи входной монеты (если таковая есть).
Таким образом, в худшем случае пользователь платит три отдельных налога при своп с точным входом:
- Комиссия передачи входной монеты на
amount_in(органу сбора комиссий монеты). - Торговая комиссия пула на остаток (распределяется как описано выше).
- Комиссия передачи выходной монеты на
amount_out(органу сбора комиссий монеты).
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, подписаноPoolState.pool_creator. - Не может быть переактивирована или перенаправлена после создания. Пул, инициализированный с
enable_creator_fee = false, никогда не будет взимать комиссию создателя; один, инициализированный с конкретнымcreator_fee_on, не может переключать стороны.
CollectCreatorFee бесконечно.
Операционный процесс сборки
| Подписант | Инструкция | Обнуленные счётчики источника | Типичная частота |
|---|---|---|---|
amm_config.protocol_owner | CollectProtocolFee | protocol_fees_token{0,1} | Еженедельно или программно |
amm_config.fund_owner | CollectFundFee | fund_fees_token{0,1} | Еженедельно или программно |
pool_state.pool_creator | CollectCreatorFee | creator_fees_token{0,1} | В любое время |
security/admin-and-multisig. Подписант создателя — это учётная запись, которая запустила Initialize.
Изменение категории комиссии
Ставки комиссии могут быть изменены администратором черезUpdateAmmConfig (см. products/cpmm/instructions). Изменения вступают в силу при следующем своп для каждого пула, связанного с этой AmmConfig — нет миграции, потому что пулы загружают конфиг при каждом своп.
Что администратор не может делать:
- Перемещать пул из одной
AmmConfigв другую. - Переоценивать уже накопленные комиссии задним числом.
- Собирать комиссии без подписи
protocol_owner/fund_owner.
Чтение комиссий из работающего пула
Сравнение с CLMM и AMM v4
См.reference/fee-comparison для матрицы бок-о-бок. Краткий обзор:
- AMM v4 использует фиксированную 0,25% торговую комиссию с другим распределением LP/протокола и без комиссии фонда.
- CLMM комиссии зависят от категории расстояния между тиками, накапливаются для каждой позиции (не для пула), и запрашиваются через
DecreaseLiquidityилиCollectFees.
Куда дальше
products/cpmm/math— где вычитание торговой комиссии вставляется в кривую.products/cpmm/instructions— списки учётных записей инструкцииCollect*.algorithms/token-2022-transfer-fees— как правильно объединить комиссию пула с комиссией передачи монеты.


