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.
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Идентификаторы программ и seeds PDA для CPMM перечислены в
reference/program-addresses. На этой странице рассматривается назначение каждого аккаунта и инварианты, которые он поддерживает, а не жёстко заданные адреса.Шесть аккаунтов пула CPMM
Каждый пул CPMM полностью описывается шестью адресами, производными программы (PDA) под программой CPMM, плюс один общий аккаунтAmmConfig, на который он ссылается. Имея два mint’а, вы можете детерминировано вычислить всё остальное без обращения к сети.
| Аккаунт | Seed(s) | Владелец | Назначение |
|---|---|---|---|
authority | "vault_and_lp_mint_auth_seed" | CPMM | Подписант для каждого перемещения средств из хранилища и каждой операции mint/burn LP. Общий для всех пулов CPMM. |
poolState | "pool", ammConfig, token0Mint, token1Mint или любая пара ключей, подписанная создателем | CPMM | Структура состояния пула — пара mint’ов, балансы хранилищ, предложение LP, начисленные комиссии, указатель наблюдения. Инструкция Initialize CPMM принимает либо каноническую PDA, полученную из четырёх seeds, либо произвольную пару ключей, подписанную создателем. Путь со случайной парой ключей существует для предотвращения front-running атаки, где злоумышленник отслеживает mempool и спешит занять каноническую PDA раньше легитимного создателя. |
lpMint | "pool_lp_mint", poolState | SPL Token | LP токен пула. Предложение = общее выданное LP. Полномочия на mint = PDA полномочий CPMM. |
vault0 | "pool_vault", poolState, token0Mint | SPL Token / Token-2022 | Хранит баланс пула token0. Принадлежит PDA полномочий. |
vault1 | "pool_vault", poolState, token1Mint | SPL Token / Token-2022 | Хранит баланс пула token1. Принадлежит PDA полномочий. |
observation | "observation", poolState | CPMM | Кольцевой буфер образцов цены для TWAP. Записывается при каждом обмене. |
| Аккаунт | Seed(s) | Владелец | Назначение |
|---|---|---|---|
ammConfig | "amm_config", index: u16 | CPMM | Содержит ставки торговой комиссии, комиссии протокола, фонда, создателя и ключи администратора. Один на каждый «ярус комиссий». Poolstate привязывается к одному при создании и не может измениться позже. |
Вычисление пула, имея только два mint’а
ID пула — это не всегда каноническая PDA.
Initialize принимает произвольную пару ключей, подписанную владельцем, как pool_state в дополнение к приведённой выше PDA. Если переданный аккаунт не совпадает с канонической PDA, программа требует, чтобы он был подписан — т. е. создатель передаёт свежую пару ключей, которой они подписывают. Это защита от front-run’а: любая третья сторона, спешащая захватить каноническую PDA, может быть обойдена легитимным создателем, использующим вместо этого случайную пару ключей. Нижестоящие PDA (lpMint, vault0, vault1, observation) по-прежнему производны из poolState.key(), поэтому они остаются уникальными для любого используемого адреса. При индексировании пулов всегда обнаруживайте ID пула из состояния в цепи (например, аккаунты PoolState под программой CPMM), а не путём вычисления канонической PDA — последний пропустит пулы со случайными ключами.Разметка аккаунтов
Полные определения на Rust находятся в исходном кодеraydium-cp-swap. Приведённые ниже поля — это те, которые вы будете читать из интеграции.
PoolState
lp_supply— внутреннее зеркало пула общего предложения LP mint’а. Используйте его для математики доли LP; значение должно совпадать с предложением mint’а в цепи, но его чтение изPoolStateизбегает дополнительной выборки аккаунта.protocol_fees_token{0,1},fund_fees_token{0,1}— начисленные комиссии, ещё не собранные. Они не влияют на ценообразование обмена; они остаются в хранилищах до вызоваCollectProtocolFee/CollectFundFee.status— битовая маска, контролирующая, разрешены лиSwap,Deposit,Withdraw. Обновляется администратором черезUpdatePoolStatus. SDK проверяет это перед созданием транзакции; если вы делаете CPI напрямую, проверьте сами.token0_program/token1_program— программа токена, в которую нужно делать CPI для каждого хранилища. Один может быть классическим SPL Token, а другой Token-2022; они независимы.open_time— временная метка Unix. Обмены до этого времени не работают. Депозиты разрешены доopen_time, так что пул может быть инициализирован.creator_fee_on/enable_creator_fee— вместе контролируют, активна ли опциональная комиссия создателя для этого пула и с какой стороны обмена она собирается.enable_creator_fee == falseполностью обнуляет путь комиссии создателя. Когда включено,creator_fee_onвыбирает:0= снять комиссию с любого токена, который является входом обмена (BothToken);1= снять комиссию только изtoken_0(пропустить на обменахtoken_1 → token_0);2= снять комиссию только изtoken_1. Устанавливается при создании пула черезInitializeWithPermission; не может измениться позже.creator_fees_token_{0,1}— начисленные комиссии создателя, собираемые черезCollectCreatorFee.
AmmConfig
trade_fee_rateиcreator_fee_rate— доли объёма, обе обозначены в единицах1/1_000_000.2500означает 0.25% объёма торговли.protocol_fee_rateиfund_fee_rate— доли торговой комиссии (не объёма), с тем же знаменателем1/1_000_000. Комиссия создателя не является долей торговой комиссии — это её собственная независимая ставка. Полная арифметика вproducts/cpmm/fees.index— этоu16, поэтому seed hash использует 2 байта big-endian. Ошибка на один байт в порядке байтов — распространённая ошибка интеграции.AmmConfigнеизменяем на уровне пула. Пул указывает на одинAmmConfigпри создании и никогда не переключается. Изменения комиссии распространяются, потому что пул читает конфиг при каждом обмене — но пул не может быть перемещён между ярусами комиссий.
creator_fee_rate) находится на AmmConfig и общая для всего яруса комиссий. Начисляет ли конкретный пул её (enable_creator_fee) и с какой стороны обмена она попадает (creator_fee_on) находится на PoolState. Комиссия создателя независима от торговой комиссии — это её собственная ставка, начисляемая на её собственные счётчики (creator_fees_token_{0,1}), и никогда не уменьшает доли LP / протокола / фонда торговой комиссии. Сбор осуществляется через CollectCreatorFee. Полную механику см. в products/cpmm/fees.
Permission
Небольшой аккаунт контроля доступа, используемый InitializeWithPermission. Программа CPMM поддерживает путь создания пула с разрешением, чтобы другие программы (например, LaunchLab при выводе токена в CPMM) могли доказать, что они имеют право создать пул против данного AmmConfig.
CreatePermissionPda и отзывается через ClosePermissionPda. Конечные пользователи не взаимодействуют с этим аккаунтом напрямую — это вспомогательная система для cross-program потоков.
Хранилища и Token-2022
vault0 и vault1 принадлежат CPMM authority PDA, а их владелец токен-программы (token_program) — либо SPL Token, либо Token-2022, определённый при создании пула по программе mint’а. Пул прозрачно обрабатывает оба случая — вы передаёте правильный ID программы токена для каждой стороны в аккаунты инструкции Swap / Deposit / Withdraw.
CPMM применяет строгий список разрешённых расширений при создании пула (is_supported_mint в utils/token.rs). Mint Token-2022 может быть использован в пуле CPMM, только если каждое расширение, которое он содержит, находится в этом списке:
TransferFeeConfig. Применяется mint’ом при каждом переводе. Пул находится на стороне получателя для депозитовSwapBaseInputи на стороне отправителя для вывода. Программа вычисляет чистое количество, попадающее в хранилище, и устанавливает кривую соответственно. См.algorithms/token-2022-transfer-fees.MetadataPointerиTokenMetadata. Стандартные метаданные on-mint. Не влияет на математику обмена.InterestBearingConfig. UI количество mint’а накапливает проценты. Хранилище хранит сырые количества; кривая работает только с сырыми количествами. UI, отображающие APR, должны вызывать помощников Token-2022 для рендеринга UI количества.ScaledUiAmount. Расширение масштабирования отображения UI. Та же обработка, что иInterestBearingConfig— кривая использует сырые количества.
PermanentDelegate, TransferHook, DefaultAccountState, NonTransferable, ConfidentialTransfer, Group/GroupMember, MintCloseAuthority и т. д. — вызовет отклонение Initialize с ошибкой NotSupportMint. Исключение — небольшой жёстко закодированный whitelist mint’ов в программе (несколько определённых pubkey), которые обходят проверку расширений; он используется для подключения определённых mint’ов в каждом конкретном случае.
Список проверенных расширений и whitelist mint’ов находятся в исходном коде CP-Swap под programs/cp-swap/src/utils/token.rs и могут изменяться при будущих обновлениях программы.
Observation
Аккаунт observation — это кольцевой буфер записейObservationState, каждая из которых хранит block_timestamp и кумулятивную цену. При каждом обмене программа добавляет новое наблюдение, если прошло достаточно времени с последнего. TWAP вычисляются путём чтения двух наблюдений и деления Δcumulative / Δtime.
ObservationState — около 4 100 байт после окружающих полей и дискриминатора.
Два правила для потребителей:
- Не используйте одно наблюдение как цену. Это кумулятивное значение, а не спотовая цена. Используйте два из них для вычисления TWAP.
- Выбирайте наблюдения на расстоянии как минимум одного блока. Обмены внутри одного блока могут не создать новое наблюдение; чтение подряд может вернуть одну и ту же запись.
products/clmm/accounts.
Жизненный цикл аккаунтов
| Событие | Созданные аккаунты | Уничтоженные аккаунты |
|---|---|---|
Initialize | poolState, lpMint, vault0, vault1, observation | — |
Deposit | — (может создать пользовательскую LP ATA) | — |
Withdraw | — | — |
Swap | — (может создать пользовательскую целевую ATA) | — |
CollectProtocolFee | — | — |
CollectFundFee | — | — |
UpdatePoolStatus | — | — |
poolState остаётся. Это намеренно: повторное инициализирование того же пула позже сохраняет его исторический буфер наблюдений, и его вычисление PDA остаётся стабильным.
Где что читать
- Списки аккаунтов инструкций (какие из приведённых выше являются writable/signer для каждой инструкции):
products/cpmm/instructions. - Семантика начисления комиссий:
products/cpmm/fees. - Математика обмена / правило обновления наблюдения:
products/cpmm/math. - Канонические seeds / идентификаторы программ:
reference/program-addresses.


