Skip to main content
Эта страница переведена с помощью ИИ. За эталон принимается английская версия.Открыть английскую версию →
Программы продуктов Raydium — это независимые кодовые базы, но они разработаны в соответствии с общим набором соглашений. Эта страница является каноническим справочником по этим соглашениям. Главы по отдельным продуктам описывают, как соглашения реализованы в их учетных записях; эта страница описывает сами соглашения.

Что здесь означает «общее»

Через кодовую базу проходят три вида совместного использования:
  • Совместное использование соглашений. Каждая программа использует один и тот же паттерн вывода PDA, одну и ту же форму разделения комиссий и одну и ту же идею учетной записи наблюдений — но каждая реализует их в своей собственной программе с собственными seeds.
  • Совместное использование учетных записей. Несколько учетных записей — это буквально один и тот же записи во многих пулах (глобальный PDA органа управления в CPMM, учетные записи AmmConfig).
  • Совместное использование вне цепи. Один REST API и один TypeScript SDK обслуживают все четыре программы. Интеграторы взаимодействуют с одним хостом HTTP и одним пакетом NPM независимо от того, какую программу они в итоге вызывают.
Пять примитивов ниже охватывают все, что пересекает границы программ.

1. PDA органов управления

Каждая программа Raydium имеет ровно один PDA, который владеет своими хранилищами токенов. Пользователи никогда не держат полномочия хранилища напрямую — PDA органа управления — это единственный подписант, который может перемещать средства, и он подписывает только когда действительная инструкция программы ему это говорит. Паттерн идентичен во всех продуктах; seeds отличаются: Из этого следует несколько вещей:
  • Для CPMM и CLMM PDA органа управления — это глобальная учетная запись — каждый пул этого типа использует его. Если вы выполняете CPI в CPMM, вам нужен он один раз, а не для каждого пула.
  • Для органов управления для каждого пула / фермы вы выводите PDA из ID пула/фермы. SDK делает это в getPoolKeys / getFarmKeys; если вы интегрируетесь напрямую, вы выводите с помощью findProgramAddressSync.
  • Владение хранилищем не может быть изменено. Как только учетная запись токена создана с PDA органа управления в качестве владельца, только этот PDA — вызванный программой — может передавать средства. Нет переопределения администратора.
Для точных seeds и макетов ATA для каждой программы см. products/cpmm/accounts, products/clmm/accounts, products/amm-v4/accounts, products/farm-staking/accounts, products/launchlab/accounts.

2. Учетные записи администратора и конфигурации

CPMM и CLMM используют паттерн учетной записи конфигурации, называемый AmmConfig: небольшую глобальную учетную запись, индексируемую u16, содержащую ставки комиссий и направления администратора, которые применяются ко всему уровню комиссии. Пулы привязываются к конфигурации при создании и никогда не переподключаются.
Правила дороги:
  • Уровни комиссий глобальны. Когда пул говорит «это пул с комиссией 0,25%», это означает, что он привязан к AmmConfig, чей trade_fee_rate был 0,25% во время создания. Нет переопределения ставки для каждого пула.
  • Конфигурация может быть изменена, но пулы не следуют. Если орган управления конфигурацией редактирует AmmConfig, каждый существующий пул, привязанный к этой конфигурации, немедленно получает новую ставку. Это особенность, а не ошибка; это то, как экономические изменения на уровне протокола распространяются без миграций для каждого пула.
  • disable_create_pool — это рычаг устаревания. Когда уровень комиссии закрывается, мультиподпись протокола устанавливает этот флаг — существующие пулы продолжают работать, но новые пулы не могут выбрать уровень.
  • protocol_owner / fund_owner — это подписанты для вызовов сбора комиссий. Установка их на мультиподпись — это то, что ограничивает вывод комиссий. Это НЕ адреса назначения для самих комиссий; это protocol_fee_destination / fund_fee_destination на той же учетной записи.
AMM v4 не имеет AmmConfig — его параметры комиссий зависят от пула и жестко закодированы при создании. Farm и LaunchLab имеют свои собственные эквиваленты (FarmConfig, LaunchConfig), описанные в их соответствующих главах. Полная таблица того, кто может изменять что, находится в security/admin-and-multisig. Текущие пользовательские разделения комиссий находятся в ray/protocol-fees.

3. Разделение комиссий протокола / фонда / создателя

Каждая комиссия за обмен CPMM и CLMM разделяется между до четырьмя направлениями на выходе:
Механически:
  1. Комиссия за торговлю накапливается в пуле. Комиссия удаляется из входной стороны обмена, и сумма после комиссии — это то, что видит математика постоянного произведения. Это то, что означает «LP получает комиссию» — k растет и растет подразумеваемая стоимость на токен LP.
  2. Доли протокола/фонда/создателя вычитаются из этого накопления на стороне LP в учетные записи счетчиков для каждого пула. Они находятся в состоянии пула (protocol_fees_token{0,1}, fund_fees_token{0,1} и т. д.) до тех пор, пока кто-нибудь не вызовет соответствующую инструкцию сбора. Они не покидают хранилища пула до этого момента; с точки зрения обмена они все еще «в пуле».
  3. Сбор перемещает их. Пути протокола и фонда требуют соответствующего подписанта protocol_owner / fund_owner из AmmConfig. Комиссии создателя CPMM используют либо путь CollectCreatorFee, подписанный создателем, либо CollectCreatorFeePermissionless, который может запустить любой плательщик, но который фиксирует направления на канонические ATA создателя.
Несколько важных наблюдений:
  • Процентные доли разделения — это доля от комиссии за торговлю, а не от торговли. Комиссия за торговлю 0,25% с долей протокола 12% означает, что протокол получает 0,25% × 12% = 0,03% торговли — не 12% торговли.
  • Комиссии создателя существуют только в пулах, выпущенных LaunchLab. Стандартные пулы CPMM/CLMM имеют трехстороннее разделение (LP / протокол / фонд). LaunchLab добавляет четвертый слот, направленный тому, кто запустил токен, настроенный при Initialize и неизменяемый.
  • AMM v4 разделяется только двумя способами, жестко закодированными для каждого пула: LP и протокол. Нет слота фонда, нет слота создателя.
  • Фонд против протокола — оба являются направлениями казны протокола, но они имеют разные подписанты и разные предполагаемые использования. protocol исторически финансирует операции; fund — это более долгосрочная казна. Разделение между ними само по себе настраивается.
Конкретные ставки находятся в reference/fee-comparison и ray/protocol-fees.

4. Учетные записи наблюдений (кольцевой буфер TWAP)

Как CPMM, так и CLMM поддерживают учетную запись наблюдений для каждого пула — кольцевой буфер фиксированного размера образцов (timestamp, cumulative_price), которые другие контракты могут использовать для получения устойчивого к манипуляциям TWAP.
Как это работает:
  • Каждый обмен вызывает update_observation. Программа читает текущую цену, умножает на прошедшие секунды с момента предыдущего наблюдения и добавляет это в кумулятивный счетчик. Новая запись перезаписывает самый старый слот (в стиле кольцевого буфера).
  • TWAP за окно = (cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start]). Потребители выбирают два наблюдения, охватывающие желаемое окно, и делят.
  • Raydium сам не использует TWAP для ценообразования. Математика AMM читает спотовые резервы напрямую. Наблюдения — это внешний эффект — Raydium платит стоимость их записи, чтобы другие контракты могли их читать.
  • AMM v4 не имеет учетной записи наблюдений. Это старше, чем дизайн ObservationState; интеграторы, желающие получить TWAP v4, должны вычислить его вне цепи из истории логов.
Детали макета и математика индексирования находятся в products/cpmm/accounts и products/clmm/accounts.

5. REST API + SDK + IDL

Поверхность вне цепи — это единая тройка, используемая каждым продуктом:
  • REST APIhttps://api-v3.raydium.io. Индексированное представление всего состояния в цепи, в основном для чтения, плюс механизм котировок. Один хост, одна схема.
  • TypeScript SDK@raydium-io/raydium-sdk-v2 на NPM. Создает и подписывает транзакции для каждой программы. Обращается к API для котировок/метаданных, обращается к Solana RPC для обновления состояния перед подписью.
  • Реестр IDL — Anchor IDL для каждой опубликованной программы находятся в репозитории raydium-idl (один JSON для каждой программы: CPMM, CLMM, LaunchLab). TypeScript SDK использует эти IDL внутри; нижестоящие клиенты Rust / Python регенерируют из одних и тех же файлов.
Граница между ними четкая: Частая ошибка — подавать выходные данные REST API прямо в транзакцию. Не делайте этого — повторно получите соответствующее состояние пула/позиции из Solana RPC в слоте, в котором вы подписываете. SDK делает это автоматически для потоков первой стороны; если вы обходите SDK, вы должны сделать это сами. Полный справочник находится в sdk-api/, с поверхностью IDL конкретно в sdk-api/anchor-idl.

6. Индексеры и ценовые каналы

REST API питается собственным индексером Raydium, который подписывается на логи программ из флота Solana RPC и записывает денормализованные записи в хранилище SQL. Два следствия для интеграторов:
  • Индексер — это единственное, что «знает» о состоянии между программами. Сопоставление пула CPMM с его аналогом CLMM, вычисление числа объема за 24 часа в версиях программ, выбор фермы, связанной с минтом LP — все это работа индексера. Сами программы этого не делают.
  • Простой индексера — это простой API. Если API возвращает устаревшие или пустые данные, индексер — это подозреваемый. Состояние в цепи не затронуто; интеграторы с собственным RPC и SDK могут продолжать транзакции.
Ценовые каналы — это отдельная проблема. API публикует поле priceUsd в большинстве ответов пула; это вычисляется вне цепи из снимка представления индексера резервов пула и цены справочного предложения (пулы USDC как общая точка опоры). Это достаточно хорошо для UI; это не безопасно использовать как оракул в цепи. Используйте для этого наблюдение TWAP.

Что не является общим

Стоит явно перечислить, потому что новые читатели часто предполагают больше совместного использования, чем существует:
  • Программы не вызывают друг друга. Обмен CPMM никогда не выполняет CPI в CLMM или AMM v4. Единственная программа, которая компонует несколько AMM, — это программа маршрутизации AMM — и она сама тонкая, просто выполняя CPI в каждый AMM по очереди.
  • Нет общего органа управления обновлениями между программами. Каждая программа в цепи имеет свой собственный ключ обновления программы (мультиподпись 3/4 плюс блокировка на 24 часа). Они не связаны.
  • Нет общего состояния между фермами и AMM. Ферма не знает, из какого пула CPMM, NFT позиции CLMM или несвязанного токена SPL происходит LP, который она ставит. Программа фермы рассматривает минт ставок как непрозрачный.
  • Нет зависимости от оракула. Ценообразование — это резервы в цепи. Нет резервного варианта Pyth/Switchboard; AMM не проверяет оракул перед очисткой.

Указатели

Источники:
  • Raydium SDK v2 — источник истины для seeds PDA, макетов учетных записей и определений IDL.
  • Реестр Raydium IDL — Anchor IDL.
  • Страницы учетных записей для каждого продукта, цитируемые выше.