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

# Filtragem de Contas de Token (ATA) via WebSocket

> Capture transferências de tokens SPL para uma carteira nos fluxos WebSocket do LaserStream com o filtro tokenAccounts em transactionSubscribe — correspondência baseada em proprietário que um filtro plain accountInclude perde.

O filtro `tokenAccounts` no método WebSocket [`transactionSubscribe`](/docs/pt-BR/rpc/websocket/transaction-subscribe) permite que uma assinatura corresponda a atividades nas **contas de token associadas (ATAs) que uma carteira possui**, não apenas transações onde a chave pública da carteira aparece diretamente. O mesmo filtro está disponível via gRPC — veja [Filtragem de Conta de Token (ATA)](/docs/pt-BR/laserstream/token-account-filtering) para a versão gRPC.

## O problema: filtros de conta comuns perdem transferências de token recebidas

Quando você vigia uma carteira com `accountInclude: [wallet]`, você apenas corresponde a transações onde essa chave pública da carteira aparece nas chaves de conta da transação. Um caso comum é perdido: quando alguém envia um token SPL (como USDC) para a carteira, a transferência toca na **conta de token associada (ATA)** da carteira — um endereço derivado por programa separado — não na própria chave pública da carteira.

Portanto, uma assinatura plain `accountInclude: [wallet]` nunca vê transferências de token recebidas. Você teria que enumerar cada ATA que a carteira possui antecipadamente e adicionar cada uma delas ao filtro — mas ATAs são criadas sob demanda (uma por mint), então você não pode saber o conjunto completo com antecedência.

## Como funciona a expansão `tokenAccounts`

Defina `tokenAccounts` na assinatura para expandir a correspondência para que uma carteira `accountInclude` **também** corresponda a transações que tocam uma conta de token que ela possui. A correspondência é **baseada em proprietário**: o LaserStream resolve as contas de token possuídas pelos seus endereços `accountInclude` no momento da correspondência, então captura qualquer conta de token que a carteira possui — incluindo as não canônicas — não apenas o endereço ATA derivado. Você nunca precisa listar as ATAs você mesmo.

Assinaturas que omitem `tokenAccounts` se comportam exatamente como antes, então é seguro adicionar a um filtro existente.

## Modos de expansão

`tokenAccounts` assume um de três valores string:

| Valor              | Correspondências                                                                                               | Volume                       | Use para                                                                                                   |
| ------------------ | -------------------------------------------------------------------------------------------------------------- | ---------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `"balanceChanged"` | Transações onde um saldo de token possuído realmente mudou (ou sua conta de token foi fechada)                 | Menor — o padrão recomendado | "Avise-me quando o dinheiro realmente se mover" — depósitos, retiradas, trocas que se liquidam na carteira |
| `"all"`            | Qualquer transação que referencia uma conta de token que a carteira possui, mesmo que o saldo não tenha mudado | Maior                        | Visibilidade completa sobre qualquer coisa que toque nas contas de token da carteira                       |
| `"none"`           | Sem expansão — idêntico a omitir o campo                                                                       | —                            | O padrão                                                                                                   |

Comece com `"balanceChanged"`. Ele captura o movimento real de fundos a uma fração do volume de `"all"`.

## Use em `transactionSubscribe`

`tokenAccounts` é uma extensão Helius para a API WebSocket padrão do Solana. Um valor inválido retorna um erro JSON-RPC `-32602`: `Invalid tokenAccounts value '<x>', expected one of: none, balanceChanged, all`.

```javascript theme={"system"}
const ws = new WebSocket('wss://mainnet.helius-rpc.com/?api-key=<API_KEY>');

ws.on('open', () => {
  ws.send(JSON.stringify({
    jsonrpc: '2.0',
    id: 1,
    method: 'transactionSubscribe',
    params: [
      {
        accountInclude: ['<WALLET_PUBKEY>'],
        tokenAccounts: 'balanceChanged' // also match the wallet's ATAs
      },
      { commitment: 'confirmed', encoding: 'jsonParsed', maxSupportedTransactionVersion: 0 }
    ]
  }));
  setInterval(() => ws.ping(), 30_000);
});

ws.on('message', (data) => {
  const msg = JSON.parse(data.toString());
  const result = msg.params?.result;
  if (!result) return;
  // Token balances this wallet owns that changed in the tx
  const owned = (result.transaction.meta.postTokenBalances || [])
    .filter((b) => b.owner === '<WALLET_PUBKEY>');
  console.log(result.signature, owned);
});
```

## Lendo o que foi correspondido

Uma vez que uma transação corresponde via expansão ATA, o movimento de token da carteira está presente na `meta.postTokenBalances` e `meta.preTokenBalances` da transação. Filtre essas entradas por `owner` para isolar os saldos que sua carteira realmente possui, então compare `preTokenBalances` contra `postTokenBalances` na mesma `accountIndex` para ver quanto cada mint moveu. O exemplo acima mostra a etapa de filtragem.

## Relacionado

<CardGroup cols={2}>
  <Card title="transactionSubscribe" icon="bolt" href="/docs/pt-BR/rpc/websocket/transaction-subscribe">
    Todos os filtros e opções de `transactionSubscribe`, incluindo `tokenAccounts`.
  </Card>

  <Card title="Filtragem de Contas de Token (gRPC)" icon="coins" href="/docs/pt-BR/laserstream/token-account-filtering">
    A mesma expansão `tokenAccounts` nos filtros de transação gRPC do LaserStream.
  </Card>

  <Card title="Filtragem notifyOn" icon="filter" href="/docs/pt-BR/rpc/websocket/notify-on-filtering">
    Pule atualizações de conta sem operação em `accountSubscribe` e `programSubscribe`.
  </Card>

  <Card title="Início Rápido do WebSocket" icon="rocket" href="/docs/pt-BR/rpc/websocket/quickstart">
    Conecte-se ao LaserStream WebSocket e transmita seus primeiros eventos.
  </Card>
</CardGroup>
