> ## 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 Akun Token (ATA)

> Tangkap transfer token SPL masuk ke dompet dalam stream gRPC LaserStream dengan ekspansi tokenAccounts (ATA) — pencocokan accountInclude berbasis pemilik melewatkannya.

Filter `tokenAccounts` LaserStream memungkinkan langganan transaksi gRPC mencocokkan aktivitas pada **akun token terkait (ATA) yang dimiliki dompet**, bukan hanya transaksi yang memuat pubkey dompet secara langsung. Filter yang sama tersedia melalui WebSocket — lihat [Pemfilteran Akun Token (ATA) melalui WebSocket](/docs/id/rpc/websocket/token-account-filtering).

## Masalahnya: filter akun biasa melewatkan transfer token masuk

Saat Anda memantau dompet dengan `accountInclude: [wallet]`, yang dicocokkan hanya transaksi yang memuat pubkey dompet tersebut dalam kunci akun transaksi. Ada satu kasus umum yang terlewat: ketika seseorang mengirim token SPL (misalnya USDC) ke dompet, transfer tersebut menyentuh **akun token terkait (ATA)** milik dompet — alamat terpisah yang diturunkan dari program — bukan pubkey dompet itu sendiri.

Akibatnya, langganan `accountInclude: [wallet]` biasa tidak pernah melihat transfer token masuk. Anda harus mencantumkan semua ATA milik dompet terlebih dahulu dan menambahkan masing-masing ke filter — tetapi ATA dibuat sesuai kebutuhan (satu per mint), sehingga Anda tidak dapat mengetahui seluruh kumpulannya sebelumnya.

## Cara kerja ekspansi `tokenAccounts`

Tetapkan `tokenAccounts` pada filter transaksi untuk memperluas pencocokan, sehingga dompet `accountInclude` **juga** cocok dengan transaksi yang menyentuh akun token miliknya. Pencocokan dilakukan **berdasarkan pemilik**: LaserStream menentukan akun token yang dimiliki oleh alamat `accountInclude` Anda saat pencocokan, sehingga dapat menangkap setiap akun token milik dompet — termasuk akun nonkanonis — bukan hanya alamat ATA turunan. Anda tidak perlu mencantumkan sendiri semua ATA tersebut.

Langganan yang tidak menyertakan `tokenAccounts` berperilaku sama persis seperti sebelumnya, sehingga aman untuk menambahkannya ke filter yang sudah ada.

Untuk mencocokkan berdasarkan token, bukan berdasarkan dompet, lihat [Pemfilteran Mint Token](/docs/id/laserstream/mint-filtering). Kedua flag dapat digabungkan, sehingga satu filter dapat memantau aktivitas satu dompet untuk satu token.

## Mode ekspansi

`tokenAccounts` menerima salah satu dari tiga nilai string:

| Nilai              | Yang dicocokkan                                                                             | Volume                                               | Gunakan untuk                                                                                               |
| ------------------ | ------------------------------------------------------------------------------------------- | ---------------------------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| `"balanceChanged"` | Transaksi ketika saldo token yang dimiliki benar-benar berubah (atau akun tokennya ditutup) | Lebih rendah — pilihan default yang direkomendasikan | "Beri tahu saya saat dana benar-benar berpindah" — setoran, penarikan, dan swap yang diselesaikan ke dompet |
| `"all"`            | Setiap transaksi yang merujuk pada akun token milik dompet, meskipun saldonya tidak berubah | Lebih tinggi                                         | Visibilitas penuh terhadap apa pun yang menyentuh akun token dompet                                         |
| `"none"`           | Tanpa ekspansi — sama seperti tidak menyertakan kolom ini                                   | —                                                    | Pilihan default                                                                                             |

Mulailah dengan `"balanceChanged"`. Mode ini menangkap perpindahan dana yang sebenarnya dengan volume yang jauh lebih kecil daripada `"all"`.

## Menggunakannya di LaserStream gRPC

Tambahkan `tokenAccounts` ke filter transaksi dalam `SubscribeRequest` Anda. [Helius LaserStream SDK](/docs/id/laserstream/clients) mengonversi string tersebut menjadi enum `TokenAccountExpansionControlFlag` tingkat wire untuk Anda (bagian dari `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);
});
```

Lihat [panduan Pemantauan Transaksi](/docs/id/laserstream/guides/transaction-monitoring) untuk contoh yang lebih lengkap tentang perbandingan saldo sebelum dan sesudah, serta [referensi Permintaan Langganan](/docs/id/laserstream/grpc) untuk semua kolom filter transaksi.

## Membaca hasil yang cocok

Setelah transaksi cocok melalui ekspansi ATA, pergerakan token dompet berada dalam `meta.postTokenBalances` dan `meta.preTokenBalances` milik transaksi. Filter entri tersebut berdasarkan `owner` untuk mengisolasi saldo yang benar-benar dimiliki dompet Anda, lalu bandingkan `preTokenBalances` dengan `postTokenBalances` pada `accountIndex` yang sama untuk melihat seberapa banyak setiap mint berpindah. Contoh di atas menunjukkan langkah pemfilteran; [panduan Pemantauan Transaksi](/docs/id/laserstream/guides/transaction-monitoring#contoh-4-pantau-dompet-termasuk-transfer-token) menunjukkan perbandingan lengkapnya.

## Terkait

<CardGroup cols={2}>
  <Card title="Transaction Monitoring" icon="receipt" href="/docs/id/laserstream/guides/transaction-monitoring">
    Strategi pemfilteran lengkap dan contoh pemantauan dompet yang dapat dijalankan melalui gRPC.
  </Card>

  <Card title="Token Account Filtering (WebSocket)" icon="bolt" href="/docs/id/rpc/websocket/token-account-filtering">
    Kolom `tokenAccounts` yang sama pada metode WebSocket `transactionSubscribe`.
  </Card>

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

  <Card title="Compressed Filters" icon="layer-group" href="/docs/id/laserstream/cuckoo-filters">
    Lacak ratusan ribu akun dalam satu stream.
  </Card>

  <Card title="Token Mint Filtering" icon="coins" href="/docs/id/laserstream/mint-filtering">
    Berlangganan setiap transaksi untuk mint token dengan `matchMints`.
  </Card>
</CardGroup>
