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

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

Легенда:
  • Точно: какое значение фиксируется вызывающей стороной (Вход = фиксированный вход amount_in; Выход = фиксированный выход amount_out).
  • Вариант: устаревшие инструкции требуют непустой deque limit_prices, даже если в маршруте нет хопа CLMM. Текущие инструкции (8 / 9) воспринимают пустой limit_prices как «без проверок», что рекомендуется для нового кода.
Все варианты swap направляют промежуточные токены через ATA, контролируемые пользователем — пользователь владеет входной ATA, каждой промежуточной ATA и выходной ATA. Для новых интеграций используйте тег 8 (SwapBaseIn) или тег 9 (SwapBaseOut), если у вас нет конкретной причины вызывать устаревший вариант.

Текущие инструкции swap (рекомендуется)

Это точки входа, которые должны использовать новые коды. Структура аргументов такая же, как у устаревших вариантов, но limit_prices может быть пуста.

SwapBaseIn (тег 8)

Мультихоп swap с фиксированным входом. Вызывающая сторона фиксирует amount_in; маршрутизатор выполняет хоп за хопом и проверяет, что финальное количество достигает или превышает minimum_amount_out. Аргументы
Аккаунты
Точный список аккаунтов на хоп зависит от программы базовой биржи (AMM v4 / CPMM / CLMM / Stable). Маршрутизатор вызывает каждую программу по очереди через CPI и проверяет, что ID программы совпадает с одной из четырёх поддерживаемых программ. Предусловия
  • Вызывающая сторона подписывает user_input_ata.
  • user_input_ata.amount >= amount_in.
  • Каждая промежуточная ATA пользователя существует и принадлежит вызывающей стороне.
  • Если какой-либо хоп является CLMM и вы хотите применить ограничения по цене, предоставьте одну запись limit_prices на хоп CLMM.
Постусловия
  • Баланс user_input_ata уменьшен на amount_in.
  • Баланс user_output_ata увеличен на ≥ minimum_amount_out.
  • Каждая промежуточная ATA остаётся с нулевым чистым изменением (маршрут потребляет то, что произвёл предыдущий хоп).
Распространённые ошибки
  • ExceededSlippage — финальный выход < minimum_amount_out.
  • InvalidInput — пустой маршрут, некорректные аккаунты или неподдерживаемая pool_program.
  • SqrtPriceX64 — цена хопа CLMM вышла за границы предоставленного ограничения limit_prices (только когда limit_prices непуста).

SwapBaseOut (тег 9)

Мультихоп swap с фиксированным выходом. Вызывающая сторона фиксирует amount_out; маршрутизатор проверяет, что фактический вход не превышает maximum_amount_in. Аргументы
Аккаунты — такая же структура, как в теге 8. Предусловия
  • Вызывающая сторона подписывает user_input_ata; баланс >= maximum_amount_in (наихудший случай).
  • Каждая промежуточная ATA и выходная ATA существуют.
Постусловия
  • user_input_ata уменьшена на фактически необходимое количество (≤ maximum_amount_in).
  • user_output_ata увеличена ровно на amount_out.
Распространённые ошибки
  • ExceededSlippage — требуемый вход превышает maximum_amount_in.
  • InvalidInput, SqrtPriceX64 — как для тега 8.

Устаревшие инструкции swap

Эти более старые варианты всё ещё могут быть вызваны в работающей программе и документируются здесь для полноты. Предпочитайте теги 8 / 9 для нового кода; оба устаревших варианта ниже требуют непустую deque limit_prices даже при отсутствии хопа CLMM, что затрудняет их использование.

SwapBaseInWithUserAccount (тег 0)

Мультихоп swap с фиксированным входом, идентичный по структуре тегу 8, но с более строгим требованием limit_prices. Аргументы
Аккаунты — такая же структура, как в SwapBaseIn (тег 8). Все промежуточные слоты должны быть ATA, принадлежащими вызывающей стороне. Предусловия
  • Вызывающая сторона подписывает user_input_ata.
  • user_input_ata.amount >= amount_in.
  • Все промежуточные ATA пользователя существуют и принадлежат вызывающей стороне.
  • limit_prices непуста (по одной записи на хоп CLMM; при отсутствии хопа CLMM заполните заполнителями).
Постусловия
  • Баланс user_input_ata уменьшен на amount_in.
  • Баланс user_output_ata увеличен на ≥ minimum_amount_out.
Распространённые ошибки
  • ExceededSlippage.
  • InvalidInput — пустая limit_prices отклоняется в этом устаревшем варианте.
  • SqrtPriceX64.

SwapBaseOutWithUserAccount (тег 1)

Swap с фиксированным выходом, устаревший аналог SwapBaseOut (тег 9). Аргументы
Аккаунты — такая же структура, как в теге 0 / теге 9. Предусловия
  • Вызывающая сторона подписывает user_input_ata.
  • user_input_ata.amount >= maximum_amount_in.
  • Все промежуточные ATA пользователя существуют и принадлежат вызывающей стороне.
  • limit_prices непуста.
Постусловия
  • user_input_ata уменьшена на фактически необходимое количество (≤ maximum_amount_in).
  • user_output_ata увеличена ровно на amount_out.
Распространённые ошибки
  • ExceededSlippage.
  • InvalidInput.
  • SqrtPriceX64.

Утилиты

CreateSyncNative (тег 5)

Создание (если отсутствует) и синхронизация ATA wSOL в один шаг. Удобно при обёртывании SOL параллельно с swap. Аргументы
Аккаунты
Эффект
  • Создаёт user_wsol_ata, если она ещё не существует.
  • Переводит amount lamports с собственного баланса SOL подписанта на ATA.
  • Вызывает SyncNative на ATA, чтобы её баланс токена отразил новые lamport.
Распространённые ошибки
  • InvalidOwner — владелец user_wsol_ata не является подписантом.

CloseTokenAccount (тег 6)

Закрытие счёта токена и возврат его ренты в кошелёк назначения. Пара для CreateSyncNative: после swap-ноги wSOL вызовите CloseTokenAccount, чтобы вернуть ренту, которая поддерживала ATA wSOL. Аргументы — отсутствуют. Аккаунты
Эффект
  • Закрывает token_account_to_close.
  • Переводит баланс lamport, не облагаемый рентой (~0.00203928 SOL в mainnet для обычного счёта SPL Token), на destination_for_rent.
  • Баланс токена на счёте должен быть равен нулю.
Распространённые ошибки
  • InvalidOwner — вызывающая сторона не является владельцем ATA.
  • Баланс счёта токена не равен нулю.

Что дальше