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

# トークンミントのフィルタリング

> matchMints を使用して、LaserStream gRPC でトークンミントに関係するすべてのトランザクションをサブスクライブします。ミントがアカウントキーに含まれないため accountInclude では検出できない SPL 転送も取得できます。

LaserStream の `matchMints` フラグを使用すると、gRPC トランザクションのサブスクリプションで、アカウントキーに加えて、**トランザクションの処理前後のトークン残高に含まれるトークンミント**も照合できます。

ミントを `accountInclude` に指定して `matchMints: true` を設定すると、そのトークンに関係するすべてのトランザクション（転送、スワップ、mint-to、バーン、アカウントのクローズ）を受信できます。

<Note>
  `matchMints` は LaserStream gRPC でのみ利用できます。LaserStream WebSocket ではまだ利用できません。
</Note>

## 問題：通常のアカウントフィルターでは大半のトークン転送を検出できません

`accountInclude: [mint]` でトークンを監視する場合、ミントの pubkey がトランザクションのアカウントキーに含まれるトランザクションだけが一致します。

一般的な SPL `Transfer` 命令はミントを参照しません。参照するのは送信元トークンアカウント、送信先トークンアカウント、所有者だけです。そのため、通常のアカウントフィルターでは、あらゆるトークンで最も一般的な操作を検出できません。

ミントを直接渡す命令だけが一致します。たとえば、`MintTo`、`Burn`、`TransferChecked`、およびプログラムアカウントにミントが含まれるスワップです。これまでは、すべてのトランザクションをストリーミングし、各トランザクションのトークン残高を自分で調べる以外に回避策はありませんでした。

## `matchMints` の仕組み

トランザクションフィルターで `matchMints: true` を設定すると、LaserStream はトランザクションの `preTokenBalances` と `postTokenBalances` からミントの集合を構築します。

次に、`accountInclude`、`accountExclude`、`accountRequired` の各リストが、アカウントキーとそのミント集合の**両方**に対して照合されます。残高が変化したかどうかに関係なく、そのミントのトークンアカウントがいずれかの残高リストに含まれていれば、そのミントは条件を満たします。

このフラグはオプトインです。省略したフィルターは従来とまったく同じように動作するため、既存のサブスクリプションがすでに受信している内容を変えずに追加できます。SPL と Token-2022 の両方のプログラムが処理前後のトークン残高を設定するため、どちらのミントにも対応しています。

## セマンティクス

| 述語                | `matchMints` なし                     | `matchMints: true` あり                                                     |
| ----------------- | ----------------------------------- | ------------------------------------------------------------------------- |
| `accountInclude`  | リスト内のいずれかのキーがアカウントキーに含まれている場合に一致します | リスト内のいずれかのキーがアカウントキー**または**ミント集合に含まれている場合に一致します                           |
| `accountExclude`  | リスト内のいずれかのキーがアカウントキーに含まれている場合に除外します | リスト内のいずれかのキーがアカウントキー**または**ミント集合に含まれている場合に除外します                           |
| `accountRequired` | リスト内のすべてのキーがアカウントキーに含まれている必要があります   | リスト内のすべてのキーがアカウントキー**または**ミント集合に含まれている必要があります（各キーはいずれか一方に含まれていれば条件を満たします） |

その他のフィルターロジックは変更されません。

* 1 つの名前付きフィルター内の述語は、引き続き AND で結合されます（`vote`、`failed`、`signature`、アカウントリスト）。
* 複数の名前付きフィルターは、引き続き OR で結合されます。
* リスト内の値は OR です（`accountRequired` のみ、すべてが一致する必要があります）。
* トークン残高がないトランザクションでは、アカウントキーだけの照合にフォールバックします。`matchMints` によって、トークンアクティビティのないトランザクションが追加されることはありません。
* `matchMints` だけではストリームを制限しません。フィルターが受理されるには、アカウントリストに少なくとも 1 つのキーまたはミントを指定するか、別の制限述語を指定する必要があります。

<Note>
  LaserStream は完全に一致する pubkey でミントを照合します。`tokenAccounts: "balanceChanged"` とは異なり、ミントには「残高が変化した場合のみ」のモードはありません。
</Note>

## LaserStream gRPC での使用方法

`SubscribeRequest` 内のトランザクションフィルターに `matchMints: true` を追加し、ミントを `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/v0.3.0` 以降の Go モジュールが必要です。

    ```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 クライアントを使用する場合は、Helius proto（`laserstream-core-proto` 11.3.0 以降、または SDK リポジトリに同梱されている `.proto`）から再生成してください。

`match_mints` は `SubscribeRequestFilterTransactions` のフィールド 32 です。アップストリームの Triton proto から生成されたクライアントは不明なフィールドを通知せずに破棄するため、再生成するまでこのフラグは機能しません。

トランザクションフィルターの全フィールドについては、[Subscribe Request リファレンス](/docs/ja/laserstream/grpc#サブスクライブリクエスト)を参照してください。

## `tokenAccounts` と組み合わせて、1 つのウォレットの 1 つのトークンを監視する

`matchMints` は [`tokenAccounts` の展開](/docs/ja/laserstream/token-account-filtering)と組み合わせられるため、1 つのフィルターでウォレット所有者とミントを同時に照合できます。

次の例では、1 つのウォレットの 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` でそのミントを探します。通常の転送では、ミントは一般にアカウントキーに含まれないため、そこで探さないでください。

同じ `accountIndex` に対して `preTokenBalances` と `postTokenBalances` の差分を取ると、どの所有者間でどれだけのトークンが移動したかを確認できます。

トランザクション構造の詳細については、[トランザクション監視ガイド](/docs/ja/laserstream/guides/transaction-monitoring#トランザクションデータ構造)を参照してください。

## 制限事項と注意点

* ミントはアカウントキーと同じ `accountInclude`、`accountExclude`、`accountRequired` リストに指定するため、リストごとの同じプラン上限にカウントされます。ミント専用の上限はありません。
* 照合コストは、指定するミント数に応じて増加しません。100 個でも 100,000 個でもパフォーマンスは同じです。また、このフラグを設定しないサブスクライバーに追加コストは発生しません。
* [履歴リプレイ](/docs/ja/laserstream/historical-replay)は `matchMints` に対応しているため、リプレイのサブスクリプションはライブストリームと同じトランザクションを返します。
* トランザクションのサブスクリプションに[圧縮（cuckoo）フィルター](/docs/ja/laserstream/cuckoo-filters)を追加すると、`matchMints` はアカウントキーだけでなく、ミント集合もそのフィルターに対して照合します。
* `matchMints` は、メインネットと devnet を含むすべての 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/ja/laserstream/token-account-filtering">
    ウォレットが所有するトークンアカウントに関係するトランザクションを照合します
  </Card>

  <Card title="Transaction Monitoring" icon="receipt" href="/docs/ja/laserstream/guides/transaction-monitoring">
    gRPC 向けの包括的なフィルタリング戦略と実行可能な例です
  </Card>

  <Card title="Subscribe Request Reference" icon="filter" href="/docs/ja/laserstream/grpc">
    `matchMints` を含む、すべてのトランザクションフィルターフィールドです
  </Card>

  <Card title="Historical Replay" icon="clock-rotate-left" href="/docs/ja/laserstream/historical-replay">
    同じフィルターを使用して、最大 24 時間分のトークンアクティビティをバックフィルします
  </Card>
</CardGroup>
