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

# Фильтрация по минту токена

> Подпишитесь на каждую транзакцию, затрагивающую минт токена в LaserStream gRPC, с помощью matchMints. Это позволяет получать переводы SPL, которые пропускает accountInclude, поскольку минт отсутствует среди ключей аккаунтов.

Флаг `matchMints` в LaserStream позволяет подписке на транзакции gRPC выполнять сопоставление по **минтам токенов в балансах токенов до и после транзакции** в дополнение к ключам аккаунтов.

Добавьте минт в `accountInclude`, задайте `matchMints: true`, и вы будете получать каждую транзакцию, затрагивающую этот токен: переводы, свопы, выпуск токенов, сжигания и закрытия аккаунтов.

<Note>
  `matchMints` доступен только в LaserStream gRPC. В LaserStream WebSocket он пока недоступен.
</Note>

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

При отслеживании токена с помощью `accountInclude: [mint]` сопоставляются только транзакции, в которых публичный ключ минта присутствует среди ключей аккаунтов транзакции.

Классическая инструкция SPL `Transfer` никогда не ссылается на минт. В ней указываются только исходный аккаунт токена, целевой аккаунт токена и владелец, поэтому обычный фильтр аккаунтов пропускает самую распространённую операцию с любым токеном.

Сопоставляются только инструкции, которые передают минт напрямую, например `MintTo`, `Burn`, `TransferChecked`, а также свопы, у которых минт входит в число аккаунтов программы. Единственным обходным решением было получать поток всех транзакций и самостоятельно проверять балансы токенов каждой из них.

## Как работает `matchMints`

Задайте `matchMints: true` в фильтре транзакций, и LaserStream сформирует набор минтов из `preTokenBalances` и `postTokenBalances` транзакции.

Затем списки `accountInclude`, `accountExclude` и `accountRequired` сопоставляются **как** с ключами аккаунтов, **так и** с этим набором минтов. Минт соответствует условию, если любой связанный с ним аккаунт токена присутствует хотя бы в одном из списков балансов, независимо от того, изменился ли баланс.

Этот флаг включается явно. Фильтры, в которых он не указан, работают точно так же, как и раньше, поэтому его можно добавить в существующую подписку, не меняя уже получаемые ею данные. Поддерживаются минты SPL и Token-2022, поскольку обе программы заполняют балансы токенов до и после транзакции.

## Семантика

| Предикат | Без `matchMints` | С `matchMints: true` |
| - | - | - |
| `accountInclude` | Соответствует, если любой указанный ключ входит в ключи аккаунтов | Соответствует, если любой указанный ключ входит в ключи аккаунтов **или** в набор минтов |
| `accountExclude` | Отклоняет, если любой указанный ключ входит в ключи аккаунтов | Отклоняет, если любой указанный ключ входит в ключи аккаунтов **или** в набор минтов |
| `accountRequired` | Каждый указанный ключ должен входить в ключи аккаунтов | Каждый указанный ключ должен входить в ключи аккаунтов **или** в набор минтов (каждый ключ может соответствовать любому из этих условий) |

Остальная логика фильтра не меняется:

* Предикаты внутри одного именованного фильтра по-прежнему объединяются оператором AND (`vote`, `failed`, `signature` и списки аккаунтов).
* Несколько именованных фильтров по-прежнему объединяются оператором OR.
* Значения внутри списка объединяются оператором OR (кроме `accountRequired`, где должны совпасть все значения).
* Для транзакции без балансов токенов используется сопоставление только по ключам. `matchMints` никогда не добавляет транзакции без активности токенов.
* Сам по себе `matchMints` не ограничивает поток. Чтобы фильтр был принят, необходимо указать хотя бы один ключ или минт в списке аккаунтов либо другой ограничивающий предикат.

<Note>
  LaserStream сопоставляет минты по точному публичному ключу. В отличие от `tokenAccounts: "balanceChanged"`, для минтов нет режима «только при изменении баланса».
</Note>

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

Добавьте `matchMints: true` в фильтр транзакций в `SubscribeRequest` и укажите минт в `accountInclude`. В этом примере передаются все транзакции USDC в основной сети:

<Tabs>
  <Tab title="TypeScript">
    Требуется `helius-laserstream` версии 0.8.5 или новее. Поле также принимается под именем `match_mints`.

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

    const USDC = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';

    const subscriptionRequest: SubscribeRequest = {
      transactions: {
        'usdc-txs': {
          accountInclude: [USDC],
          accountExclude: [],
          accountRequired: [],
          vote: false,
          failed: false,
          matchMints: true, // match USDC via pre/post token-balance mints
        },
      },
      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) => {
      const tx = data.transaction?.transaction;
      if (!tx) return;
      // USDC balances touched by this transaction
      const usdcBalances = (tx.meta?.postTokenBalances || []).filter((b: any) => b.mint === USDC);
      console.log(bs58.encode(tx.signature), usdcBalances);
    }, async (error) => {
      console.error('Stream error:', error);
    });
    ```
  </Tab>

  <Tab title="Rust">
    Требуется `helius-laserstream` версии 0.6.4 или новее (которая подключает `laserstream-core-proto` 11.3.0). Поле поступает непосредственно из proto-крейта.

    ```rust theme={"system"}
    use std::collections::HashMap;
    use helius_laserstream::grpc::{SubscribeRequest, SubscribeRequestFilterTransactions};

    let request = SubscribeRequest {
        transactions: HashMap::from([(
            "usdc-txs".to_string(),
            SubscribeRequestFilterTransactions {
                account_include: vec!["EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v".to_string()],
                vote: Some(false),
                failed: Some(false),
                match_mints: true,
                ..Default::default()
            },
        )]),
        ..Default::default()
    };
    ```
  </Tab>

  <Tab title="Go">
    Требуется модуль Go с тегом `go/v0.3.0` или новее.

    ```go theme={"system"}
    vote := false
    failed := false
    req := &laserstream.SubscribeRequest{
        Transactions: map[string]*laserstream.SubscribeRequestFilterTransactions{
            "usdc-txs": {
                AccountInclude: []string{"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"},
                Vote:           &vote,
                Failed:         &failed,
                MatchMints:     true,
            },
        },
        Commitment: &commitmentLevel,
    }
    ```
  </Tab>
</Tabs>

Если вместо SDK вы используете необработанный клиент gRPC или Yellowstone, повторно сгенерируйте код из proto Helius (`laserstream-core-proto` версии 11.3.0 или новее либо `.proto`, включённого в репозиторий SDK).

`match_mints` — это поле 32 в `SubscribeRequestFilterTransactions`. Клиенты, сгенерированные из исходного proto Triton, без уведомления отбрасывают неизвестное поле, поэтому флаг не действует, пока вы не выполните повторную генерацию.

Все поля фильтра транзакций описаны в [справочнике по запросу подписки](/docs/ru/laserstream/grpc#запрос-подписки).

## Сочетание с `tokenAccounts` для отслеживания одного токена одного кошелька

`matchMints` совместим с [расширением `tokenAccounts`](/docs/ru/laserstream/token-account-filtering), поэтому один фильтр может одновременно выполнять сопоставление по владельцам кошельков и минтам.

В этом примере передаётся каждое изменение баланса USDC одного кошелька:

```typescript theme={"system"}
transactions: {
  'wallet-usdc': {
    accountInclude: [WALLET],
    accountRequired: [USDC],
    accountExclude: [],
    tokenAccounts: 'balanceChanged', // wallet matched via its token accounts
    matchMints: true,                // USDC matched via balance mints
    vote: false,
    failed: false,
  },
},
```

Сочетание `accountInclude` и `tokenAccounts` находит транзакции, в которых изменились балансы токенов кошелька. Сочетание `accountRequired` и `matchMints` сужает их список до транзакций с USDC.

## Чтение результатов сопоставления

Если транзакция соответствует фильтру по минту, найдите этот минт в `meta.preTokenBalances[].mint` и `meta.postTokenBalances[].mint`. При обычных переводах минт, как правило, отсутствует среди ключей аккаунтов, поэтому не ищите его там.

Сравните `preTokenBalances` и `postTokenBalances` для одного `accountIndex`, чтобы определить, сколько токенов было перемещено и между какими владельцами.

Структура транзакции подробно описана в [руководстве по мониторингу транзакций](/docs/ru/laserstream/guides/transaction-monitoring#структура-данных-транзакции).

## Ограничения и примечания

* Минты указываются в тех же списках `accountInclude`, `accountExclude` и `accountRequired`, что и ключи аккаунтов, поэтому на них распространяются те же ограничения тарифного плана для каждого списка. Отдельного ограничения для минтов нет.
* Затраты на сопоставление не зависят от количества указанных минтов. Производительность одинакова для 100 и 100 000 минтов, а подписчики, которые не устанавливают этот флаг, не несут дополнительных затрат.
* [Воспроизведение истории](/docs/ru/laserstream/historical-replay) учитывает `matchMints`, поэтому подписка на воспроизведение возвращает те же транзакции, которые вернул бы поток в реальном времени.
* Если вы прикрепите [сжатый фильтр (кукушкин фильтр)](/docs/ru/laserstream/cuckoo-filters) к подписке на транзакции, `matchMints` будет проверять по нему набор минтов наряду с ключами аккаунтов.
* `matchMints` работает во всех регионах LaserStream gRPC, в основной и тестовой сетях. В настоящее время он недоступен в LaserStream WebSocket.
* Минимальные версии SDK: JavaScript/TypeScript `helius-laserstream` 0.8.5, Rust `helius-laserstream` 0.6.4, Go `go/v0.3.0`.

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

<CardGroup cols={2}>
  <Card title="Token Account (ATA) Filtering" icon="coins" href="/docs/ru/laserstream/token-account-filtering">
    Сопоставляйте транзакции, затрагивающие принадлежащие кошельку аккаунты токенов
  </Card>

  <Card title="Transaction Monitoring" icon="receipt" href="/docs/ru/laserstream/guides/transaction-monitoring">
    Полные стратегии фильтрации и готовые к запуску примеры для gRPC
  </Card>

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

  <Card title="Historical Replay" icon="clock-rotate-left" href="/docs/ru/laserstream/historical-replay">
    Восстанавливайте до 48 часов активности токенов с помощью того же фильтра
  </Card>
</CardGroup>


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