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

Обзор инструкций

Битовая маска статуса: status каждого пула — это u8, где бит 0 = депозит отключен, бит 1 = вывод отключен, бит 2 = своп отключен (PoolStatusBitIndex { Deposit, Withdraw, Swap } в программе). Нулевой бит означает, что операция разрешена; установленный бит означает, что она приостановлена. UpdatePoolStatus принимает сырой u8 и перезаписывает существующее значение. В следующих разделах каждая инструкция рассматривается подробно. Порядок счётов соответствует IDL CPMM; SDK и Rust-клиент в raydium-cp-swap/programs/cp-swap/src/instructions соответствуют этому порядку.

Initialize

Создаёт новый пул CPMM. Аргументы
Счёты (W = записываемый, S = подписывающий) * pool_state подписывает только на пути со случайной парой ключей; путь с каноническим PDA работает без подписи pool_state. Предусловия
  • Монеты отсортированы (token_0_mint < token_1_mint по порядку байтов).
  • Ни одна монета не использует расширение вне списка разрешённых CPMM (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — см. /ru/products/cpmm/accounts. Небольшой список разрешённых расширений для каждой монеты внутри программы обходит проверку для поэтапного подключения.
  • creator имеет как минимум init_amount_0 и init_amount_1 в соответствующих ATA.
  • amm_config.disable_create_pool == false.
Постусловия
  • pool_state существует с lp_supply = sqrt(init_amount_0 * init_amount_1) − LOCKED_LP.
  • Стартовый LP в размере LOCKED_LP (100 ламортов LP-токена) навсегда заблокирован в пуле — pool_state.lp_supply записывает liquidity − 100, в то время как 100 LP-единиц остаются вне обращения, предотвращая полное осушение пула и деление на ноль.
  • observation_state инициализирован; observation_index = 0 и pool_id = pool_state.key().
  • create_pool_fee ламортов переводятся от создателя к получателю и синхронизируются как нативный SOL (это ATA wSOL).
  • Битовая маска статуса пула — 0 (депозит / вывод / своп все включены).
  • enable_creator_fee = false и creator_fee_on = BothToken. Initialize не поддерживает включение комиссии создателя — этот путь — InitializeWithPermission.
  • open_time увеличивается до block_timestamp + 1, если вызывающий передал значение <= block_timestamp. Своп отклоняется до open_time; депозиты и выводы работают сразу.
Частые ошибки (полный список в /ru/reference/error-codes)
  • InvalidInput — монеты не отсортированы или идентичны.
  • NotSupportMint — заблокированное расширение Token-2022.
  • ExceededSlippage — редко; если init_amount_0/1 приводят к нулевому LP из-за несовпадения десятичных знаков.

Deposit

Добавляет ликвидность в обе монеты пропорционально пулу. Аргументы
Счёты Математика
Без изменения пропорциональности k — оба хранилища и lp_supply масштабируются на один и тот же коэффициент. Постусловия
  • lp_supply += lp_token_amount.
  • vault_0 += needed_token_0 (за вычетом любой комиссии за передачу Token-2022 на входе).
  • vault_1 += needed_token_1 (за вычетом любой комиссии за передачу Token-2022 на входе).
Частые ошибкиExceededSlippage, ZeroTradingTokens, InvalidStatus, если депозит приостановлен.

Withdraw

Сжигает LP-токены и получает обе базовые монеты пропорционально. Аргументы
Счёты (Идентично Deposit; lp_mint записываемый, потому что LP-токены сжигаются.) Математика
Постусловия
  • lp_supply -= lp_token_amount.
  • Хранилища отправляют out_token_0 / out_token_1 (валовой; пользователь получает нетто за вычетом любой комиссии за передачу Token-2022).

SwapBaseInput

Своп с точным входом. Аргументы
Счёты Порядок вход → выход определяется направлением пользователя, а не каноническим token_0 / token_1 пула. Программа определяет, какое хранилище какое, сопоставляя монеты. Математика — см. /ru/products/cpmm/math. Предусловия
  • open_time <= now.
  • pool_status разрешает своп.
  • Ни одна монета не приостановлена или заморожена для этого органа.
  • amount_in > 0.
Частые ошибки
  • ExceededSlippageamount_out < minimum_amount_out.
  • ZeroTradingTokens — сделка округляется до нуля.
  • NotApproved — пул приостановлен для свопов через UpdatePoolStatus.
  • InvalidInput — монеты не совпадают ни с одной из монет хранилища пула.

SwapBaseOutput

Своп с точным выходом. Аргументы
Счёты — то же, что и SwapBaseInput. Математика — обратная кривая с потолком, см. /ru/products/cpmm/math. Частые ошибкиExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Собирает накопленные комиссии протокола из хранилищ в назначение протокола. Аргументы — нет. Счёты Эффект
Без изменения эффективных балансов кривой (накопленные комиссии уже были исключены). Частая ошибкаNotApproved, если подписывающий не является protocol_owner.

CollectFundFee

Та же структура, что и CollectProtocolFee, но подписана fund_owner и обнуляет счётчики fund_fees_*.

CollectCreatorFee

Подписана pool_state.pool_creator. Переводит полные балансы creator_fees_token_0 и creator_fees_token_1 на токен-счета создателя, затем обнуляет оба счётчика. Возвращает NoFeeCollect, когда оба счётчика равны нулю.

CollectCreatorFeePermissionless

Любой может запустить сбор комиссии создателя. Инструкция всегда отправляет полные накопленные балансы на канонические связанные токен-счета, принадлежащие pool_state.pool_creator; вызывающий не может выбрать другого создателя или назначение. Если какой-либо ATA отсутствует, плательщик финансирует его создание. Исходный CollectCreatorFee остаётся вызываемым, поэтому существующие клиенты остаются совместимыми. Аргументы — нет. Счёты Эффект
  • Переводит все creator_fees_token_0 и creator_fees_token_1 из хранилищ пула на ATA создателя.
  • Обнуляет оба счётчика комиссии создателя и обновляет pool_state.recent_epoch.
  • Возвращает NoFeeCollect, когда оба счётчика равны нулю.

UpdatePoolStatus

Приостанавливает или возобновляет отдельные операции на пуле. Поле status — это битовая маска: Аргументы
Счёты Ключ администратора — это орган обновления программы CPMM — на практике мультиподпись Raydium. См. /ru/security/admin-and-multisig.

CreateAmmConfig

Создаёт новый уровень комиссий. Аргументы
Счёты Предусловия
  • Нет существующего AmmConfig с тем же index.
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.

UpdateAmmConfig

Изменяет ставки комиссий или владение существующим AmmConfig. Принимает param: u8 (дискриминатор для выбора обновляемого поля) и value: u64. Семантика значения для каждого параметра находится в исходном коде; обычно:
  • param = 0trade_fee_rate
  • param = 1protocol_fee_rate
  • param = 2fund_fee_rate
  • param = 3new_protocol_owner (передайте байты Pubkey как переинтерпретацию)
  • param = 4new_fund_owner
  • param = 5create_pool_fee
  • param = 6disable_create_pool
Изменения подписаны администратором и влияют на каждый пул, привязанный к этому AmmConfig при следующем своп. Без миграции; пулы просто читают новые значения.

Матрица изменения состояния

Что дальше

Источники: