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

# Фильтрация токен-счетов (ATA)

> Отслеживайте входящие переводы SPL-токенов на кошелёк в потоках LaserStream gRPC с помощью расширения tokenAccounts (ATA) — сопоставление на основе владельца находит то, что пропускает accountInclude.

Фильтр `tokenAccounts` в LaserStream позволяет подписке на транзакции gRPC находить активность в **ассоциированных токен-счетах (ATA), принадлежащих кошельку**, а не только транзакции, в которых напрямую присутствует публичный ключ кошелька. Этот же фильтр доступен через WebSocket — см. раздел [Фильтрация токен-счетов (ATA) через WebSocket](/docs/ru/rpc/websocket/token-account-filtering).

## Проблема: обычные фильтры счетов пропускают входящие переводы токенов

Когда вы отслеживаете кошелёк с помощью `accountInclude: [wallet]`, фильтр находит только транзакции, в ключах счетов которых присутствует публичный ключ этого кошелька. Однако распространённый случай остаётся незамеченным: когда кто-либо отправляет на кошелёк SPL-токен (например, USDC), перевод затрагивает **ассоциированный токен-счёт (ATA)** кошелька — отдельный адрес, производный от программы, — а не публичный ключ самого кошелька.

Поэтому обычная подписка `accountInclude: [wallet]` не обнаруживает входящие переводы токенов. Вам пришлось бы заранее перечислить все принадлежащие кошельку ATA и добавить каждый из них в фильтр. Но ATA создаются по мере необходимости (по одному на каждый минт), поэтому заранее узнать их полный набор невозможно.

## Как работает расширение `tokenAccounts`

Задайте `tokenAccounts` в фильтре транзакций, чтобы адрес кошелька `accountInclude` **также** находил транзакции, затрагивающие принадлежащий ему токен-счёт. Сопоставление выполняется **по владельцу**: во время сопоставления LaserStream определяет токен-счета, принадлежащие адресам `accountInclude`. Поэтому фильтр находит все принадлежащие кошельку токен-счета, включая неканонические, а не только производный адрес ATA. Вам не нужно самостоятельно перечислять ATA.

Подписки без `tokenAccounts` работают точно так же, как раньше, поэтому это поле можно безопасно добавить в существующий фильтр.

Чтобы выполнять сопоставление по токену, а не по кошельку, см. раздел [Фильтрация по минту токена](/docs/ru/laserstream/mint-filtering). Эти два флага можно сочетать, поэтому один фильтр может отслеживать активность одного кошелька для одного токена.

## Режимы расширения

`tokenAccounts` принимает одно из трёх строковых значений:

| Значение | Что находит | Объём | Назначение |
| - | - | - | - |
| `"balanceChanged"` | Транзакции, в которых баланс принадлежащего кошельку токена фактически изменился (или его токен-счёт был закрыт) | Ниже — рекомендуемое значение по умолчанию | «Сообщать, когда средства действительно перемещаются»: пополнения, выводы и свопы, зачисляемые на кошелёк |
| `"all"` | Любые транзакции, ссылающиеся на принадлежащий кошельку токен-счёт, даже если баланс не изменился | Выше | Полная видимость любых операций, которые хотя бы затрагивают токен-счета кошелька |
| `"none"` | Без расширения — аналогично отсутствию этого поля | — | Значение по умолчанию |

Начните с `"balanceChanged"`. Этот режим отслеживает фактическое перемещение средств, создавая лишь малую часть объёма `"all"`.

## Использование в LaserStream gRPC

Добавьте `tokenAccounts` в фильтр транзакций в вашем `SubscribeRequest`. [SDK Helius LaserStream](/docs/ru/laserstream/clients) преобразует строку в перечисление `TokenAccountExpansionControlFlag` протокольного уровня (доступно в `yellowstone-grpc-proto` версии 12.5.0 и новее).

```typescript theme={"system"}
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream';
import bs58 from 'bs58';

const wallet = '<WALLET_PUBKEY>';

const subscriptionRequest: SubscribeRequest = {
  transactions: {
    "wallet-activity": {
      accountInclude: [wallet],
      accountExclude: [],
      accountRequired: [],
      vote: false,
      failed: false,
      tokenAccounts: "balanceChanged" // also match the wallet's ATAs
    }
  },
  commitment: CommitmentLevel.CONFIRMED,
  accounts: {}, slots: {}, transactionsStatus: {},
  blocks: {}, blocksMeta: {}, entry: {}, accountsDataSlice: [],
};

const config: LaserstreamConfig = {
  apiKey: 'YOUR_API_KEY',
  endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com',
};

await subscribe(config, subscriptionRequest, async (data) => {
  if (!data.transaction?.transaction) return;
  const tx = data.transaction.transaction;
  // Token balances this wallet owns that changed in the tx
  const owned = (tx.meta?.postTokenBalances || []).filter((b: any) => b.owner === wallet);
  console.log(bs58.encode(tx.signature), owned);
}, async (error) => {
  console.error('Stream error:', error);
});
```

Более полный пример со сравнением балансов до и после транзакции см. в [руководстве по мониторингу транзакций](/docs/ru/laserstream/guides/transaction-monitoring), а описание всех полей фильтра транзакций — в [справочнике по запросу Subscribe](/docs/ru/laserstream/grpc).

## Как определить, что совпало

Когда транзакция найдена с помощью расширения ATA, перемещение токенов кошелька отражается в полях `meta.postTokenBalances` и `meta.preTokenBalances` транзакции. Отфильтруйте эти записи по `owner`, чтобы выделить балансы, фактически принадлежащие вашему кошельку. Затем сравните `preTokenBalances` и `postTokenBalances` с одинаковым `accountIndex`, чтобы определить изменение суммы для каждого минта. В примере выше показан этап фильтрации, а в [руководстве по мониторингу транзакций](/docs/ru/laserstream/guides/transaction-monitoring#пример-4-отслеживание-кошелька-включая-переводы-токенов) — полное сравнение.

## Связанные материалы

<CardGroup cols={2}>
  <Card title="Transaction Monitoring" icon="receipt" href="/docs/ru/laserstream/guides/transaction-monitoring">
    Полные стратегии фильтрации и готовый к запуску пример отслеживания кошелька через gRPC.
  </Card>

  <Card title="Token Account Filtering (WebSocket)" icon="bolt" href="/docs/ru/rpc/websocket/token-account-filtering">
    То же поле `tokenAccounts` в методе WebSocket `transactionSubscribe`.
  </Card>

  <Card title="Subscribe Request Reference" icon="filter" href="/docs/ru/laserstream/grpc">
    Все поля фильтра транзакций, включая `tokenAccounts`.
  </Card>

  <Card title="Compressed Filters" icon="layer-group" href="/docs/ru/laserstream/cuckoo-filters">
    Отслеживайте сотни тысяч счетов в одном потоке.
  </Card>

  <Card title="Token Mint Filtering" icon="coins" href="/docs/ru/laserstream/mint-filtering">
    Подпишитесь на все транзакции для минта токена с помощью `matchMints`.
  </Card>
</CardGroup>


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