> ## 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.

# Интеграция агрегатора

> Как обнаружить пулы Raydium, получить котировки по CPMM / CLMM / AMM v4 и маршрутизировать атомарные свопы через правильный набор программ. Документация для DEX-агрегаторов и swap-интерфейсов кошельков.

<Info>
  **Эта страница переведена с помощью ИИ. За эталон принимается английская версия.**

  [Открыть английскую версию →](/integration-guides/aggregator)
</Info>

<Info>
  Задача агрегатора — предоставить пользователю лучшую возможную цену на множестве пулов, возможно распределив единый вход через несколько маршрутов пулов, и выполнить это атомарно. На этой странице описаны специфические для Raydium части этой работы: обнаружение пулов, получение котировок и сборка транзакций.
</Info>

## Обнаружение пулов

### Инвентарь пулов

Вам нужен полный список активных пулов Raydium для каждого продукта. Три варианта:

1. **REST API** (проще всего): `GET https://api-v3.raydium.io/pools/info/list?poolType=all&pageSize=1000&page=1` возвращает пулы партиями по 1000. Пагинируйте, пока не получите все. Кэшируйте на 1–5 минут.
2. **Сканирование on-chain**: `getProgramAccounts` на программах CPMM, CLMM и AMM v4, отфильтрованные по дискриминатору аккаунта состояния. Дает \~каждый активный пул за \~10 секунд RPC. Полезно, когда API недоступен или rate-limited.
3. **Гибридный подход**: используйте API как основной источник; запускайте ежедневное сканирование on-chain как проверку целостности. Команда обязуется поддерживать API полным, но пулы, созданные прямым CPI (без фронтенда), иногда отстают.

### Поиск по паре монет

Для конкретной пары `(mintA, mintB)` используйте `GET /pools/info/mint?mint1=...&mint2=...&poolType=all&sort=liquidity`. Возвращает каждый пул на любом уровне комиссии и типе продукта. До \~10 результатов на пару — обычное дело для часто используемых монет; сортируйте по TVL и возьмите несколько лучших для маршрутизации.

## Получение котировок

Математика котировок отличается по продуктам. Используйте чистые математические функции SDK, чтобы не переImplementировать:

```ts theme={null}
// CPMM
const cpmmQuote = raydium.cpmm.computeAmountOut({
  poolInfo: cpmmPool,
  amountIn,
  mintIn,
  mintOut,
  slippage: 0,        // compute exact expected; layer slippage at route level
});

// CLMM — crosses ticks; deterministic but more expensive.
// `computeAmountOutFormat` is the canonical helper exposed via `PoolUtils` in
// raydium-sdk-v2: the `*Format` suffix signals that it returns the output
// pre-shaped for transaction building (including `remainingAccounts` for tick arrays).
const { output: clmmOut, remainingAccounts } = PoolUtils.computeAmountOutFormat({
  poolInfo:  clmmPool,
  poolState: clmmPoolState,
  tickArrayCache,
  amountIn,
  tokenIn:   mintIn,
  slippage:  0,
});

// AMM v4
const ammV4Quote = raydium.liquidity.computeAmountOut({
  poolInfo: ammV4Pool,
  amountIn,
  mintIn: mintIn,
  mintOut: mintOut,
  slippage: 0,
});
```

Возвращаемые значения для всех трёх: `{ amountOut, fee, priceImpact, minAmountOut }`. Для сравнения агрегаторов используйте `amountOut` (до slippage).

### Свежесть кэша

Состояние пула устаревает быстро. Рекомендуемые целевые частоты обновления:

| Тип пула            | Частота обновления | Причина                                                                   |
| ------------------- | ------------------ | ------------------------------------------------------------------------- |
| CPMM с `<$100k` TVL | `<10s`             | Резервы меняются на каждой сделке.                                        |
| CPMM с `>$10M` TVL  | 30–60s             | Резервы доминирующие; малые сделки — шум.                                 |
| CLMM                | `<30s`             | Границы тиков; одна большая сделка может переконфигурировать ликвидность. |
| AMM v4              | `<30s`             | Движения на стороне OpenBook не отражаются в vault'ах.                    |

Для агрегатора, получающего котировки с интерактивной задержкой, подпишитесь на обновления WebSocket аккаунтов (`accountSubscribe`) для каждого релевантного состояния пула. Это переворачивает модель с polling на push.

### Коррекции Token-2022

Если какой-либо mint в маршруте имеет комиссию за передачу Token-2022, математика котировки должна скорректировать входы и выходы согласно [`algorithms/token-2022-transfer-fees`](/ru/algorithms/token-2022-transfer-fees). SDK обрабатывает это, если `poolInfo.mintA.extensions.transferFeeConfig` заполнен. Проверьте поле `.extensions` перед доверием котировке.

## Маршрутизация

### Маршруты через один пул

Большинство маршрутов идут через один пул. Выберите пул с наибольшим `amountOut`. Если несколько близки по значению, разрешайте ничью по уровню комиссии (ниже лучше), затем по TVL (больше безопаснее).

### Разделённая маршрутизация

Для больших сделок, где один пул имеет >5% ценового влияния, разделите по пулам. Простой жадный алгоритм:

```
remaining = amountIn
routes    = []
while remaining > 0:
    best_pool, best_size = argmax over pools of:
        marginal_out_per_in(pool, current_size_toward_pool + epsilon)
    size = min(remaining, best_pool.max_size_at_target_impact)
    routes.append((best_pool, size))
    remaining -= size
```

Это создает вектор маршрутизации `[(pool_A, 0.6), (pool_B, 0.3), (pool_C, 0.1)]`, который минимизирует совокупное влияние. Надлежащее решение выпуклой оптимизации (например, уравнивание предельных цен по пулам) на практике находится в пределах \~1% от жадного результата.

### Многопрыжковые маршруты

`USDC → RAY → SOL` через два отдельных пула обычен, когда ни один прямой пул `USDC-SOL` не дает хорошей котировки (редко). Применяйте границы slippage на каждом прыжке; каждый прыжок обеспечивает свой собственный `minAmountOut`. Смотрите [`algorithms/slippage-and-price-impact`](/ru/algorithms/slippage-and-price-impact).

Многопрыжок по одному пулу (например, два прыжка CLMM на `SOL-USDC`) всегда субоптимален в сравнении с одним прыжком — не генерируйте такие маршруты.

## Сборка транзакций

### Один прыжок, один пул

Используйте напрямую `raydium.trade.swap` из SDK:

```ts theme={null}
const { execute } = await raydium.trade.swap({
  poolKeys:        poolInfo,
  amountIn,
  amountOut:       quote.minAmountOut,
  fixedSide:       "in",
  inputMint:       mintIn,
  txVersion:       TxVersion.V0,
  computeBudgetConfig: {
    units:         250_000,
    microLamports: priorityFee,
  },
});
```

### Разделённые и многопрыжковые маршруты

Композируйте ATA + инструкции вручную. Шаблон:

```
[1] ComputeBudget set_compute_unit_limit
[2] ComputeBudget set_compute_unit_price
[3] createATA (если требуется, один раз на mint, который пользователь не держит)
[4..N] SwapInstruction для каждого (pool, size) в маршрутах
[N+1] CloseAccount (если вы оборачиваете/развораичваете SOL)
```

Всё в одной транзакции для атомарности. Для 3-пулового разделения на V0 с таблицами поиска адресов, это обычно вмещается в \~1100 байт. Для 4+ пулов, ограничение размера транзакции заставляет либо мультитранзакцию, либо консолидацию на mint-центре.

### Атомарность

Агрегаторы должны гарантировать атомарность: либо весь маршрут выполняется, либо ничего. Инструкции swap Raydium реверт на `ExceededSlippage`, поэтому многопуловой маршрут, где один прыжок падает, вызывает откат всей транзакции. Бесплатно.

Исключение: если ваш маршрут идёт через Raydium + сторонний DEX, убедитесь, что этот DEX также имеет модель revert-on-slippage. Некоторые программы игнорируют границы slippage (редко).

## Подводные камни

### 1. Устаревшие котировки

Между тем, как пользователь видит "Вы получите 125.43 RAY" и приземлением транзакции, резервы могут сдвинуться. Переполучите состояние пула непосредственно перед отправкой; переквотируйте; если новая котировка на >1% хуже, пауза и переподтверждение с пользователем.

### 2. Чёрные списки пулов

Некоторые пулы Raydium — это токены мошенников с комиссиями передачи 99% или с не передаваемыми расширениями. REST API помечает их (см. поле `tags`); пропускайте любой пул, помеченный `scam` или `honeypot`. Запуск собственных проверок безопасности поверх тегов Raydium — благоразумно.

### 3. Требование observation-state на CLMM

CLMM `SwapV2` принимает аккаунт `observation_state`. SDK заполняет его за вас; вручную построенные инструкции часто забывают, что вызывает откат программы с `AccountNotFound`. Всегда включайте его.

### 4. Таблицы поиска адресов

Raydium поддерживает публичные таблицы поиска для своих наиболее используемых аккаунтов (основные mint'ы, ID программ, AmmConfigs). Агрегаторы должны их потреблять — это экономит \~100 байт на транзакцию и позволяет большим маршрутам вмещаться в V0. Получение адресов LUT:

```ts theme={null}
const raydiumLUTs = await raydium.getRaydiumLutAddresses();
```

### 5. Обработка перегрузки

Во время окон с высоким объёмом, транзакции могут сидеть в mempool несколько блоков. Агрессивный retry на TX expiry (не на revert — reverts детерминированы) рекомендуется. Опция `sendAndConfirm` SDK выполняет базовые retry'и; production-агрегаторы накладывают свою собственную логику (Jito bundles, мультиRPC трансляция) сверху.

## Контрольный список

Перед запуском в production, проверьте:

* [ ] Обнаружение пулов охватывает CPMM + CLMM + AMM v4 исчерпывающе.
* [ ] Котировки совпадают с собственной котировкой Raydium UI в пределах 1 basis point на нескольких тестовых сделках.
* [ ] Разделённая маршрутизация активируется для сделок >5% влияния на любом одном пуле.
* [ ] Priority fees согласованы с недавними комиссиями pool-program (смотрите [`integration-guides/priority-fee-tuning`](/ru/integration-guides/priority-fee-tuning)).
* [ ] Комиссии передачи Token-2022 вычислены и показаны пользователю.
* [ ] Транзакции откатываются чисто при превышении slippage.
* [ ] Логика retry различает tx expiry (retry) от revert (не retry).

## Ссылки

* [`integration-guides/routing-and-mev`](/ru/integration-guides/routing-and-mev) — защита от sandwich, bundles.
* [`integration-guides/priority-fee-tuning`](/ru/integration-guides/priority-fee-tuning) — размер инструкций compute-budget.
* [`sdk-api/rest-api`](/ru/sdk-api/rest-api) — endpoints списков пулов.

Источники:

* [Raydium SDK v2 `trade` module](https://github.com/raydium-io/raydium-sdk-V2)
