> ## Documentation Index
> Fetch the complete documentation index at: https://www.helius.dev/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Торгуйте с помощью Preconfirmations

> Реагируйте на транзакции Solana до их включения в блок: подпишитесь с помощью фильтров preconfSubscribe, декодируйте двоичные данные и действуйте через Sender Max.

[Preconfirmations](/docs/ru/pre-confirmations/overview) передает транзакции в потоке до их распространения в виде шредов — Helius предварительно подтверждает их сразу после выполнения лидером и передает вместе со статусом выполнения. В этом руководстве вы создадите обработчик, который отслеживает целевой аккаунт, декодирует каждую транзакцию и реагирует с помощью [Sender Max](/docs/ru/sending-transactions/sender-max).

<Tip>
  Для Preconfirmations требуется [тариф Professional или выше](/docs/ru/billing/plans). Стоимость составляет 10 кредитов за сообщение, при этом для каждой подписки действует минимум в 300 кредитов за каждый охваченный слот. См. раздел [«Цены»](/docs/ru/pre-confirmations/overview#тарификация).
</Tip>

## Ограничьте поток перед подключением

Нефильтрованный `preconfSubscribe` передает каждую транзакцию по цене 10 кредитов за каждую. Применяйте фильтрацию на стороне сервера, чтобы платить только за транзакции, на основе которых вы торгуете. Для каждой подписки по-прежнему действует минимум в 300 кредитов за каждый охваченный слот, поэтому используйте одну подписку с фильтром вместо нескольких подписок с узкими фильтрами.

```json theme={"system"}
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "preconfSubscribe",
  "params": [
    {
      "failed": false,
      "regionInclude": ["ewr"],
      "accountInclude": ["TARGET_WALLET_OR_PROGRAM"]
    }
  ]
}
```

Для большинства торговых обработчиков достаточно трех фильтров:

* `failed: false` отбрасывает транзакции, о неуспешном выполнении которых уже известно: пытаться опередить их нет смысла.
* `regionInclude` привязывает поток к [региону](/docs/ru/pre-confirmations/preconf-subscribe#фильтрация-по-местоположению), ближайшему к вашей инфраструктуре, чтобы переход между регионами не лишил вас преимущества во времени.
* `accountInclude` находит любую транзакцию, которая ссылается на вашу цель: кошелек, пул AMM, программу и т. д. Helius обрабатывает таблицы поиска адресов на стороне сервера, поэтому фильтр срабатывает, даже если аккаунт загружается через ALT.

## Подключитесь, оформите подписку и декодируйте данные

`preconfSubscribe` доступен через эндпоинт Gatekeeper (`wss://beta.helius-rpc.com`), а уведомления поступают в виде двоичных кадров, а не JSON.

Каждый кадр содержит фиксированный 18-байтовый префикс, за которым следует транзакция, сериализованная с помощью bincode:

```javascript listener.js theme={"system"}
const WebSocket = require('ws');
const { VersionedTransaction } = require('@solana/web3.js');

const ws = new WebSocket('wss://beta.helius-rpc.com/?api-key=YOUR_API_KEY');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'preconfSubscribe',
    params: [{
      failed: false,
      regionInclude: ['ewr'],
      accountInclude: ['TARGET_WALLET_OR_PROGRAM']
    }]
  }));
  setInterval(() => ws.ping(), 30_000); // keep the connection alive
});

ws.on('message', (data, isBinary) => {
  if (!isBinary) {
    const msg = JSON.parse(data.toString());
    if (msg.id === 1) console.log('Subscribed, ID:', msg.result);
    return;
  }

  // version (u8) | slot (u64 LE) | tx_index (u64 LE) | status (u8) | bincode(VersionedTransaction)
  const buf = Buffer.from(data);
  if (buf.readUInt8(0) !== 1) return; // unknown schema version; update your decoder
  const slot = buf.readBigUInt64LE(1);
  const status = buf.readUInt8(17); // 0 = failed, 1 = success, 2 = unknown
  const tx = VersionedTransaction.deserialize(buf.subarray(18));

  onScheduledTransaction({ slot, status, tx });
});

ws.on('error', console.error);
ws.on('close', () => process.exit(1)); // let your supervisor restart and resubscribe
```

Сначала проверьте байт версии. Если Helius обновит формат данных, номер версии увеличится. Ветвление по нему позволит декодеру продолжить работу. Десериализованная транзакция содержит инструкции, аккаунты и подпись.

## Действуйте с помощью Sender Max

Предварительное подтверждение приносит пользу, только если ваша ответная транзакция будет включена в блок первой.

Отправьте ответную транзакцию через [Sender Max](/docs/ru/sending-transactions/sender-max): чаевые в размере 0,001 SOL поступят в буфер приоритетных чаевых, а транзакция будет направлена по всем высокоскоростным маршрутам:

```javascript theme={"system"}
async function onScheduledTransaction({ slot, status, tx }) {
  if (!strategy.shouldReact(tx)) return;

  // strategy is your own code: it decides whether to react and returns a
  // signed, base64-encoded transaction that includes the tip and priority fee
  const reaction = await strategy.buildTransaction(tx);
  await fetch('http://ewr-sender.helius-rpc.com/fast', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      jsonrpc: '2.0',
      id: Date.now().toString(),
      method: 'sendTransaction',
      params: [reaction, { encoding: 'base64', skipPreflight: true, maxRetries: 0 }]
    })
  });
}
```

Этот обработчик должен быть кратким. Примите решение и отправьте транзакцию, а ведение журналов, учет и сверку вынесите из пути приема. Полный цикл отправки, включая прогрев соединения и оценку комиссии, описан в руководстве [«Обеспечьте включение сделок в блок с помощью Sender»](/docs/ru/sending-transactions/guides/land-trades-with-sender).

## Подтверждайте включение в блок и учитывайте возможные пропуски

Предварительное подтверждение позволяет увидеть транзакцию заранее. Она еще не включена в блок и по-прежнему может завершиться с ошибкой или быть отброшена, поэтому соблюдайте два правила:

* Проверяйте транзакцию с помощью стандартных уровней подтверждения (`getSignatureStatuses` или потока с уровнем подтверждения `processed`), прежде чем считать окончательной наблюдаемую транзакцию или вашу ответную транзакцию.
* Учитывайте возможные пропуски. Охват зависит от доли стейка, перенаправляемого в Helius, поэтому в некоторых слотах сообщения отсутствуют. Это [ожидаемое поведение](/docs/ru/pre-confirmations/overview#охват), а не разрыв соединения. Отличить одно от другого позволяет контрольный ping. После закрытия соединения подпишитесь заново.

## Связанные руководства

<CardGroup cols={2}>
  <Card title="preconfSubscribe API reference" icon="code" href="/docs/ru/pre-confirmations/preconf-subscribe">
    Полная семантика фильтров, коды регионов и структура двоичных данных
  </Card>

  <Card title="Trade on Preprocessed Transactions" icon="bolt" href="/docs/ru/preprocessed-transactions/guides/trade-on-preprocessed">
    Охват до выполнения по цене 0,1 кредита за сообщение на всех платных тарифах
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.