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

# Pemfilteran Mint Token

> Berlangganan ke setiap transaksi yang menyentuh mint token di LaserStream gRPC dengan matchMints. Menangkap transfer SPL yang terlewat oleh accountInclude karena mint tidak ada dalam kunci akun.

Flag `matchMints` milik LaserStream memungkinkan langganan transaksi gRPC mencocokkan **mint token dalam saldo token sebelum/sesudah transaksi** selain kunci akunnya.

Masukkan mint ke `accountInclude`, tetapkan `matchMints: true`, dan Anda akan menerima setiap transaksi yang menyentuh token tersebut: transfer, swap, mint-to, pembakaran, dan penutupan akun.

<Note>
  `matchMints` hanya tersedia di LaserStream gRPC. Fitur ini belum tersedia di LaserStream WebSocket.
</Note>

## Masalahnya: filter akun biasa melewatkan sebagian besar transfer token

Saat memantau token dengan `accountInclude: [mint]`, Anda hanya mencocokkan transaksi jika pubkey mint muncul dalam kunci akun transaksi.

Instruksi SPL `Transfer` klasik tidak pernah mereferensikan mint. Instruksi tersebut hanya menyebut akun token sumber, akun token tujuan, dan pemilik, sehingga filter akun biasa melewatkan operasi yang paling umum pada token apa pun.

Hanya instruksi yang meneruskan mint secara langsung yang akan cocok, seperti `MintTo`, `Burn`, `TransferChecked`, dan swap yang akun programnya menyertakan mint. Satu-satunya solusi alternatif sebelumnya adalah melakukan streaming semua transaksi dan memeriksa sendiri saldo token setiap transaksi.

## Cara kerja `matchMints`

Tetapkan `matchMints: true` pada filter transaksi, lalu LaserStream akan membuat kumpulan mint dari `preTokenBalances` dan `postTokenBalances` milik transaksi.

Daftar `accountInclude`, `accountExclude`, dan `accountRequired` Anda kemudian dicocokkan dengan **keduanya**, yaitu kunci akun dan kumpulan mint tersebut. Mint memenuhi syarat jika akun token apa pun untuk mint tersebut muncul di salah satu daftar saldo, terlepas dari apakah saldonya berubah.

Flag ini bersifat opsional, dan filter yang tidak menyertakannya akan berperilaku persis seperti sebelumnya. Karena itu, Anda dapat menambahkannya ke langganan yang sudah ada tanpa mengubah data yang telah diterima langganan tersebut. Mint SPL dan Token-2022 dapat digunakan karena kedua program mengisi saldo token sebelum/sesudah.

## Semantik

| Predikat          | Tanpa `matchMints`                                                | Dengan `matchMints: true`                                                                                                      |
| ----------------- | ----------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| `accountInclude`  | Cocok jika salah satu kunci yang tercantum ada dalam kunci akun   | Cocok jika salah satu kunci yang tercantum ada dalam kunci akun **atau** kumpulan mint                                         |
| `accountExclude`  | Menolak jika salah satu kunci yang tercantum ada dalam kunci akun | Menolak jika salah satu kunci yang tercantum ada dalam kunci akun **atau** kumpulan mint                                       |
| `accountRequired` | Setiap kunci yang tercantum harus ada dalam kunci akun            | Setiap kunci yang tercantum harus ada dalam kunci akun **atau** kumpulan mint (setiap kunci dapat dipenuhi oleh salah satunya) |

Logika filter lainnya tidak berubah:

* Predikat dalam satu filter bernama tetap digabungkan dengan AND (`vote`, `failed`, `signature`, dan daftar akun).
* Beberapa filter bernama tetap digabungkan dengan OR.
* Nilai dalam satu daftar menggunakan OR (kecuali `accountRequired`, yang mengharuskan semuanya cocok).
* Transaksi tanpa saldo token kembali menggunakan pencocokan berdasarkan kunci saja. `matchMints` tidak pernah menambahkan transaksi yang tidak memiliki aktivitas token.
* `matchMints` saja tidak membatasi stream. Anda tetap memerlukan setidaknya satu kunci atau mint dalam daftar akun (atau predikat pembatas lainnya) agar filter diterima.

<Note>
  LaserStream mencocokkan mint berdasarkan pubkey yang persis sama. Tidak ada mode "hanya saldo yang berubah" untuk mint, tidak seperti `tokenAccounts: "balanceChanged"`.
</Note>

## Menggunakannya di LaserStream gRPC

Tambahkan `matchMints: true` ke filter transaksi dalam `SubscribeRequest` Anda dan masukkan mint ke `accountInclude`. Contoh ini melakukan streaming setiap transaksi USDC di mainnet:

<Tabs>
  <Tab title="TypeScript">
    Memerlukan `helius-laserstream` versi 0.8.5 atau yang lebih baru. Kolom ini juga diterima sebagai `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">
    Memerlukan `helius-laserstream` versi 0.6.4 atau yang lebih baru (yang mengambil `laserstream-core-proto` 11.3.0). Kolom ini berasal langsung dari crate 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">
    Memerlukan modul Go pada tag `go/v0.3.0` atau yang lebih baru.

    ```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>

Jika Anda menggunakan klien gRPC mentah atau Yellowstone sebagai pengganti SDK, buat ulang dari proto Helius (`laserstream-core-proto` 11.3.0 atau yang lebih baru, atau `.proto` yang disertakan dalam repositori SDK).

`match_mints` adalah kolom 32 dari `SubscribeRequestFilterTransactions`. Klien yang dihasilkan dari proto Triton upstream secara diam-diam menghapus kolom yang tidak dikenal, sehingga flag tidak berpengaruh sampai Anda membuat ulang klien tersebut.

Lihat [referensi Permintaan Berlangganan](/docs/id/laserstream/grpc#permintaan-berlangganan) untuk setiap kolom filter transaksi.

## Gabungkan dengan `tokenAccounts` untuk memantau satu token bagi satu dompet

`matchMints` dapat digabungkan dengan [ekspansi `tokenAccounts`](/docs/id/laserstream/token-account-filtering), sehingga satu filter dapat mencocokkan pemilik dompet dan mint secara bersamaan.

Contoh ini melakukan streaming setiap perubahan pada saldo USDC milik satu dompet:

```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` ditambah `tokenAccounts` menemukan transaksi saat saldo token dompet berubah. `accountRequired` ditambah `matchMints` mempersempit hasil tersebut menjadi transaksi yang melibatkan USDC.

## Membaca hasil yang cocok

Setelah transaksi cocok melalui mint, cari mint tersebut di `meta.preTokenBalances[].mint` dan `meta.postTokenBalances[].mint`. Untuk transfer biasa, mint umumnya tidak ada dalam kunci akun, jadi jangan mencarinya di sana.

Bandingkan perbedaan `preTokenBalances` dengan `postTokenBalances` pada `accountIndex` yang sama untuk melihat jumlah token yang berpindah dan pemilik asal serta tujuannya.

[Panduan Pemantauan Transaksi](/docs/id/laserstream/guides/transaction-monitoring#struktur-data-transaksi) membahas struktur transaksi secara mendetail.

## Batasan dan catatan

* Mint dimasukkan ke daftar `accountInclude`, `accountExclude`, dan `accountRequired` yang sama dengan kunci akun, sehingga mint diperhitungkan dalam batas paket per daftar yang sama. Tidak ada batas mint terpisah.
* Biaya pencocokan tidak meningkat seiring jumlah mint yang Anda cantumkan. Performa untuk 100 mint dan 100.000 mint sama, dan pelanggan yang tidak menetapkan flag tidak dikenai biaya tambahan.
* [Pemutaran ulang historis](/docs/id/laserstream/historical-replay) mengikuti `matchMints`, sehingga langganan pemutaran ulang mengembalikan transaksi yang sama seperti yang akan dikembalikan stream langsung.
* Jika Anda memasang [filter terkompresi (cuckoo)](/docs/id/laserstream/cuckoo-filters) ke langganan transaksi, `matchMints` juga akan menguji kumpulan mint terhadap filter tersebut, selain kunci akun.
* `matchMints` aktif di semua wilayah LaserStream gRPC, baik mainnet maupun devnet. Saat ini, fitur tersebut belum tersedia di LaserStream WebSocket.
* Versi minimum SDK: JavaScript/TypeScript `helius-laserstream` 0.8.5, Rust `helius-laserstream` 0.6.4, Go `go/v0.3.0`.

## Terkait

<CardGroup cols={2}>
  <Card title="Token Account (ATA) Filtering" icon="coins" href="/docs/id/laserstream/token-account-filtering">
    Cocokkan transaksi yang menyentuh akun token milik suatu dompet
  </Card>

  <Card title="Transaction Monitoring" icon="receipt" href="/docs/id/laserstream/guides/transaction-monitoring">
    Strategi pemfilteran lengkap dan contoh yang dapat dijalankan melalui gRPC
  </Card>

  <Card title="Subscribe Request Reference" icon="filter" href="/docs/id/laserstream/grpc">
    Setiap kolom filter transaksi, termasuk `matchMints`
  </Card>

  <Card title="Historical Replay" icon="clock-rotate-left" href="/docs/id/laserstream/historical-replay">
    Isi ulang aktivitas token hingga 48 jam dengan filter yang sama
  </Card>
</CardGroup>
