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

# Подписка

> Подпишитесь на обновления аккаунтов, транзакций, блоков и слотов, чтобы получать уведомления в реальном времени через высокопроизводительный API gRPC.

<hide>
  ## Конечные точки

  Сервисы gRPC доступны в mainnet и devnet по следующим URL:

  * **Mainnet** `https://laserstream-mainnet.helius-rpc.com:443`
  * **Devnet** `https://laserstream-devnet.helius-rpc.com:443`
</hide>

## Авторизация

<ParamField query="x-token" type="string" required>
  Ваш ключ API Helius. Его можно бесплатно получить на
  [панели управления](https://dashboard.helius.dev/api-keys).
</ParamField>

## Сообщение

API gRPC поддерживает несколько типов подписок, которые можно объединить в одном запросе:

<ParamField body="accounts" type="object">
  Подписка на обновления аккаунтов. Возвращает данные при изменении указанных аккаунтов.

  <Expandable title="properties" defaultOpen>
    <ParamField body="account" type="array">
      Массив публичных ключей аккаунтов для отслеживания.
    </ParamField>

    <ParamField body="owner" type="array">
      Массив публичных ключей владельцев для отслеживания (все аккаунты, принадлежащие этим программам).
    </ParamField>

    <ParamField body="filters" type="object">
      Необязательные фильтры.

      <Expandable title="filter options">
        <ParamField body="memcmp" type="object">
          Фильтрация по определённым байтам со смещением в данных аккаунта.

          <Expandable title="properties">
            <ParamField body="offset" type="integer">
              Позиция в байтах, с которой начинается сравнение данных.
            </ParamField>

            <ParamField body="bytes" type="string">
              Данные для сравнения (в формате bytes).
            </ParamField>

            <ParamField body="base58" type="string">
              Данные для сравнения (в формате base58).
            </ParamField>

            <ParamField body="base64" type="string">
              Данные для сравнения (в формате base64).
            </ParamField>
          </Expandable>
        </ParamField>

        <ParamField body="datasize" type="integer">
          Фильтрация по точному размеру данных аккаунта в байтах.
        </ParamField>

        <ParamField body="token_account_state" type="boolean">
          Фильтрация только аккаунтов токенов.
        </ParamField>

        <ParamField body="lamports" type="object">
          Фильтрация по балансу SOL с использованием сравнений.

          <Expandable title="comparison operators">
            <ParamField body="eq" type="integer">
              Равно указанной сумме.
            </ParamField>

            <ParamField body="ne" type="integer">
              Не равно указанной сумме.
            </ParamField>

            <ParamField body="lt" type="integer">
              Меньше указанной суммы.
            </ParamField>

            <ParamField body="gt" type="integer">
              Больше указанной суммы.
            </ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>

    <ParamField body="nonempty_txn_signature" type="boolean">
      Если указано `true`, включать только обновления, вызванные транзакцией. Если указано `false`, включать только обновления, не вызванные транзакцией. Если указано `undefined`, включать все обновления.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="slots" type="object">
  Подписка на обновления слотов.

  <Expandable title="properties" defaultOpen>
    <ParamField body="filter_by_commitment" type="boolean">
      Фильтрация слотов по уровню подтверждения.
    </ParamField>

    <ParamField body="interslot_updates" type="boolean">
      Включать промежуточные обновления статуса слота (PROCESSED, CONFIRMED, FINALIZED,
      FIRST\_SHRED\_RECEIVED, COMPLETED, CREATED\_BANK, DEAD).
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="transactions" type="object">
  Подписка на обновления транзакций.

  <Expandable title="properties" defaultOpen>
    <ParamField body="vote" type="boolean">
      Включать транзакции голосования.
    </ParamField>

    <ParamField body="failed" type="boolean">
      Включать неуспешные транзакции.
    </ParamField>

    <ParamField body="signature" type="string">
      Отслеживать определённую подпись транзакции.
    </ParamField>

    <ParamField body="account_include" type="array">
      Включать только транзакции, затрагивающие эти аккаунты.
    </ParamField>

    <ParamField body="account_exclude" type="array">
      Исключать транзакции, затрагивающие эти аккаунты.
    </ParamField>

    <ParamField body="account_required" type="array">
      Транзакции должны затрагивать все эти аккаунты.
    </ParamField>

    <ParamField body="token_accounts" type="enum">
      Необязательное расширение связанных аккаунтов токенов (ATA) (тег поля 30, `TokenAccountExpansionControlFlag`). Если оно задано, кошелёк в `account_include` также соответствует транзакциям, в которых он **владеет** балансом токена SPL. Например, это могут быть входящие переводы токенов, затрагивающие аккаунт токена кошелька, а не его публичный ключ. Доступны два варианта:

      * `ALL` (**0**) — сопоставлять любую транзакцию, ссылающуюся на принадлежащий кошельку баланс токена, даже если он не изменился. Больший объём.
      * `BALANCE_CHANGED` (**1**) — сопоставлять транзакцию, если кошелёк владеет балансом токена, сумма которого изменилась (или аккаунт токена которого был закрыт) в этой транзакции.

      Чтобы отключить расширение, **не указывайте это поле** (`None`) — значение перечисления «отключено» отсутствует. Целое число вне допустимого диапазона отклоняется при создании конфигурации: `Invalid token_accounts value, expected ALL (0) or BALANCE_CHANGED (1)`.

      <Warning>
        `ALL` — это **нулевое значение**. Клиент, задающий для перечисления `0` в расчёте на значение «по умолчанию/отключено», получает `ALL` — самый широкий режим с наибольшим объёмом данных. Чтобы указать «без расширения», необходимо полностью опустить это поле.
      </Warning>
    </ParamField>

    <ParamField body="match_mints" type="boolean" default="false">
      Также сопоставлять `account_include`, `account_exclude` и `account_required` с адресами выпуска токенов в балансах токенов до и после транзакции (тег поля 32). Добавьте адрес выпуска токена в `account_include`, чтобы получать каждую транзакцию, затрагивающую этот токен, включая обычные переводы SPL, в ключах аккаунтов которых нет ссылки на адрес выпуска. Для транзакций без балансов токенов используется сопоставление только по ключам. Сам по себе `match_mints` не ограничивает поток: хотя бы один список по-прежнему должен содержать ключ или адрес выпуска токена. Совместимо с `token_accounts`. Учитывается при воспроизведении исторических данных. См. [Фильтрация по адресу выпуска токена](/docs/ru/laserstream/mint-filtering).
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="transactions_status" type="object">
  Подписка на обновления статуса транзакций.

  <Expandable title="properties" defaultOpen>
    <ParamField body="vote" type="boolean">
      Включать транзакции голосования.
    </ParamField>

    <ParamField body="failed" type="boolean">
      Включать неуспешные транзакции.
    </ParamField>

    <ParamField body="signature" type="string">
      Отслеживать определённую подпись транзакции.
    </ParamField>

    <ParamField body="account_include" type="array">
      Включать только транзакции, затрагивающие эти аккаунты.
    </ParamField>

    <ParamField body="account_exclude" type="array">
      Исключать транзакции, затрагивающие эти аккаунты.
    </ParamField>

    <ParamField body="account_required" type="array">
      Транзакции должны затрагивать все эти аккаунты.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="blocks" type="object">
  Подписка на обновления блоков.

  <Expandable title="properties" defaultOpen>
    <ParamField body="account_include" type="array">
      Включать только блоки с транзакциями, затрагивающими эти аккаунты.
    </ParamField>

    <ParamField body="include_transactions" type="boolean">
      Включать полные сведения о транзакциях.
    </ParamField>

    <ParamField body="include_accounts" type="boolean">
      Включать обновления аккаунтов.
    </ParamField>

    <ParamField body="include_entries" type="boolean">
      Включать записи блока.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="blocks_meta" type="object">
  Подписка на обновления метаданных блоков (меньший объём данных, чем при полных обновлениях блоков).

  <Expandable title="returns" defaultOpen>
    <ParamField body="slot" type="integer">
      Номер слота.
    </ParamField>

    <ParamField body="blockhash" type="string">
      Хеш блока.
    </ParamField>

    <ParamField body="rewards" type="array">
      Информация о вознаграждениях.
    </ParamField>

    <ParamField body="block_time" type="integer">
      Время блока.
    </ParamField>

    <ParamField body="block_height" type="integer">
      Высота блока.
    </ParamField>

    <ParamField body="parent_slot" type="integer">
      Родительский слот.
    </ParamField>

    <ParamField body="parent_blockhash" type="string">
      Хеш родительского блока.
    </ParamField>

    <ParamField body="executed_transaction_count" type="integer">
      Количество транзакций.
    </ParamField>

    <ParamField body="entries_count" type="integer">
      Количество записей.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="entry" type="object">
  Подписка на обновления записей.

  <Expandable title="returns" defaultOpen>
    <ParamField body="slot" type="integer">
      Номер слота.
    </ParamField>

    <ParamField body="index" type="integer">
      Индекс записи.
    </ParamField>

    <ParamField body="num_hashes" type="integer">
      Количество хешей.
    </ParamField>

    <ParamField body="hash" type="string">
      Хеш.
    </ParamField>

    <ParamField body="executed_transaction_count" type="integer">
      Количество транзакций.
    </ParamField>

    <ParamField body="starting_transaction_index" type="integer">
      Начальный индекс транзакции.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="commitment" type="enum">
  Уровень подтверждения для подписки:

  <Expandable title="levels" defaultOpen>
    <ParamField body="PROCESSED" type="integer">
      (0): Обработано текущим узлом.
    </ParamField>

    <ParamField body="CONFIRMED" type="integer">
      (1): Подтверждено квалифицированным большинством кластера.
    </ParamField>

    <ParamField body="FINALIZED" type="integer">
      (2): Финализировано кластером.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="accounts_data_slice" type="array">
  Указывает часть данных аккаунта, которую необходимо получать:

  <Expandable title="properties" defaultOpen>
    <ParamField body="offset" type="integer">
      Позиция в байтах, с которой начинается чтение данных.
    </ParamField>

    <ParamField body="length" type="integer">
      Количество байтов для чтения.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="ping" type="object">
  Включает сообщения ping-pong для контроля состояния подключения.

  <Expandable title="properties" defaultOpen>
    <ParamField body="id" type="integer">
      Числовой идентификатор ping.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="from_slot" type="integer">
  Начальный слот, с которого необходимо получать обновления. Обновления для слотов до этого значения
  будут исключены. Используйте [SubscribeReplayInfo](/docs/ru/api-reference/laserstream/grpc/subscribereplayinfo),
  чтобы определить самый ранний доступный для воспроизведения слот перед открытием подписки.
</ParamField>

<RequestExample>
  ```json Accounts Subscription theme={"system"}
  {
    "slots": {
        "slots": {}
    },
    "accounts": {
        "user-defined-label": {
            "account": [
                "DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu",
                "5U3bH5b6XtG99aVCE9ycvDgBKQx3fVT8WwTNbMToFuEr"
            ],
            "owner": [
                "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"
            ],
            "filter": {
                "memcmp": {
                    "offset": 0,
                    "bytes": "0102030405"
                },
                "datasize": 165,
                "token_account_state": true,
                "lamports": {
                    "gt": 100000000
                }
            },
            "nonempty_txn_signature": true
        }
    },
    "transactions": {},
    "blocks": {},
    "blocks_meta": {},
    "accounts_data_slice": [],
    "commitment": 1
  }
  ```

  ```json Slots Subscription theme={"system"}
  {
    "slots": {
      "incoming_slots": {}
    },
    "commitment": 1
  }
  ```

  ```json Transactions Subscription theme={"system"}
  {
    "transactions": {
      "vote": false,
      "failed": true,
      "signature": "4RPMxKBhCBubFmZ1r9BC52ztjG3qBTW9Gp1PXfufUSATQaLKTW3Dj6vQBYyVrhfjgJ4PjZLzwYs4Z92KDCPw8Qym",
      "account_include": ["DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu"],
      "account_exclude": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
      "account_required": ["11111111111111111111111111111111"]
    },
    "commitment": 2
  }
  ```

  ```json Wallet + Token Transfers (ATA expansion) theme={"system"}
  {
    "transactions": {
      "wallet": {
        "vote": false,
        "failed": false,
        "account_include": ["DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu"],
        "account_exclude": [],
        "account_required": [],
        "token_accounts": 1
      }
    },
    "commitment": 1
  }
  ```

  ```json Token Mint Subscription (match_mints) theme={"system"}
  {
    "transactions": {
      "usdc": {
        "vote": false,
        "failed": false,
        "account_include": ["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"],
        "account_exclude": [],
        "account_required": [],
        "match_mints": true
      }
    },
    "commitment": 1
  }
  ```

  ```json Transaction Status Subscription theme={"system"}
  {
    "transactions_status": {
      "vote": false,
      "failed": true,
      "account_include": ["DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu"],
      "account_exclude": ["TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"],
      "account_required": ["11111111111111111111111111111111"]
    },
    "commitment": 2
  }
  ```

  ```json Blocks Subscription theme={"system"}
  {
    "blocks": {
      "account_include": ["DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu"],
      "include_transactions": 1,
      "include_accounts": 1,
      "include_entries": 0
    },
    "commitment": 2
  }
  ```

  ```json Block Metadata Subscription theme={"system"}
  {
    "blocks_meta": {},
    "commitment": 2,
    "from_slot": 139000000
  }
  ```

  ```json Entry Subscription theme={"system"}
  {
    "entry": {},
    "commitment": 1
  }
  ```

  ```json Partial Account Data Subscription theme={"system"}
  {
    "accounts": {
      "account": ["DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu"]
    },
    "accounts_data_slice": [
      {
        "offset": 0,
        "length": 64
      },
      {
        "offset": 128,
        "length": 32
      }
    ],
    "commitment": 2
  }
  ```

  ```json Ping Subscription theme={"system"}
  {
    "ping": {
      "id": 1
    }
  }
  ```

  ```json Combined Subscription theme={"system"}
  {
    "accounts": {
      "account": ["DjUF9ASpyMbVpGJmTvzfSbCgUWj6JowwLh8dGAJzSPmu"],
      "nonempty_txn_signature": true
    },
    "slots": {
      "filter_by_commitment": 1,
      "interslot_updates": 1
    },
    "commitment": 2,
    "from_slot": 139000000,
    "ping": {
      "id": 123
    }
  }
  ```
</RequestExample>

## Уровни подтверждения

Все подписки поддерживают следующие уровни подтверждения:

* `PROCESSED`: Обработано текущим узлом (0)
* `CONFIRMED`: Подтверждено квалифицированным большинством кластера (1)
* `FINALIZED`: Финализировано кластером (2)

## Структура ответа

Ответы подписки содержат:

* `filters`: Названия фильтров, которым соответствует это обновление
* Один из следующих типов обновлений:
  * `account`: Данные аккаунта, владелец, лампорты, статус исполняемости и т. д.
  * `slot`: Информация о слоте и обновления его статуса
  * `transaction`: Полные сведения о транзакции, подпись и метаданные
  * `transaction_status`: Статус выполнения транзакции (успешно/ошибка)
  * `block`: Полные данные блока с транзакциями, аккаунтами, вознаграждениями и т. д.
  * `block_meta`: Сокращённые метаданные блока без полных сведений о транзакциях
  * `entry`: Сведения о записи внутри блока
  * `ping`/`pong`: Сообщения проверки состояния подключения
* `created_at`: Временная метка создания обновления

<ResponseExample>
  ```json Account Update theme={"system"}
  {
    "filters": ["accounts"],
    "account": {
      "account": {
        "pubkey": "BASE58_ENCODED_PUBKEY",
        "lamports": 12345678,
        "owner": "BASE58_ENCODED_OWNER",
        "executable": false,
        "rent_epoch": 361,
        "data": "BASE64_ENCODED_DATA",
        "write_version": 123,
        "txn_signature": "BASE58_ENCODED_SIGNATURE"
      },
      "slot": 189554321,
      "is_startup": false
    },
    "created_at": "2023-04-28T12:34:56.789Z"
  }
  ```

  ```json Slot Update theme={"system"}
  {
    "filters": ["slots"],
    "slot": {
      "slot": 189554321,
      "parent": 189554320,
      "status": 2,
      "dead_error": null
    },
    "created_at": "2023-04-28T12:34:56.789Z"
  }
  ```

  ```json Transaction Update theme={"system"}
  {
    "filters": ["transactions"],
    "transaction": {
      "transaction": {
        "signature": "BASE58_ENCODED_SIGNATURE",
        "is_vote": false,
        "transaction": {
          "signatures": ["BASE58_ENCODED_SIGNATURE"],
          "message": {
            "header": {
              "num_required_signatures": 1,
              "num_readonly_signed_accounts": 0,
              "num_readonly_unsigned_accounts": 1
            },
            "account_keys": ["BASE58_ENCODED_PUBKEY1", "BASE58_ENCODED_PUBKEY2"],
            "recent_blockhash": "BASE58_ENCODED_BLOCKHASH",
            "instructions": [
              {
                "program_id_index": 1,
                "accounts": [0],
                "data": "BASE64_ENCODED_INSTRUCTION_DATA"
              }
            ]
          }
        },
        "meta": {
          "err": null,
          "fee": 5000,
          "pre_balances": [10000000, 1],
          "post_balances": [9995000, 1],
          "pre_token_balances": [],
          "post_token_balances": [],
          "log_messages": ["Program log: Instruction executed"],
          "rewards": []
        },
        "index": 2
      },
      "slot": 189554321
    },
    "created_at": "2023-04-28T12:34:56.789Z"
  }
  ```

  ```json Block Metadata Update theme={"system"}
  {
    "filters": ["blocks_meta"],
    "block_meta": {
      "slot": 189554321,
      "blockhash": "BASE58_ENCODED_BLOCKHASH",
      "rewards": [
        {
          "pubkey": "BASE58_ENCODED_PUBKEY",
          "lamports": 1785000,
          "post_balance": 48589432109,
          "reward_type": 0,
          "commission": 10
        }
      ],
      "block_time": 1682684096,
      "block_height": 185432109,
      "parent_slot": 189554320,
      "parent_blockhash": "BASE58_ENCODED_PARENT_BLOCKHASH",
      "executed_transaction_count": 2576,
      "entries_count": 16
    },
    "created_at": "2023-04-28T12:34:56.789Z"
  }
  ```

  ```json Entry Update theme={"system"}
  {
    "filters": ["entry"],
    "entry": {
      "slot": 189554321,
      "index": 5,
      "num_hashes": 8765432,
      "hash": "BASE58_ENCODED_HASH",
      "executed_transaction_count": 128,
      "starting_transaction_index": 1024
    },
    "created_at": "2023-04-28T12:34:56.789Z"
  }
  ```

  ```json Pong Response theme={"system"}
  {
    "filters": [],
    "pong": {
      "id": 1
    },
    "created_at": "2023-04-28T12:34:56.789Z"
  }
  ```
</ResponseExample>


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