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

# Filtrado de cuentas de tokens (ATA)

> Detecta las transferencias entrantes de tokens SPL de una billetera en los flujos gRPC de LaserStream mediante la expansión tokenAccounts (ATA), que detecta lo que la coincidencia por propietario de accountInclude omite.

El filtro `tokenAccounts` de LaserStream permite que una suscripción de transacciones gRPC detecte actividad en las **cuentas de tokens asociadas (ATA) que posee una billetera**, no solo transacciones en las que aparece directamente la clave pública de la billetera. El mismo filtro está disponible mediante WebSocket; consulta [Filtrado de cuentas de tokens (ATA) mediante WebSocket](/docs/es/rpc/websocket/token-account-filtering).

## El problema: los filtros de cuentas simples omiten las transferencias de tokens entrantes

Cuando supervisas una billetera con `accountInclude: [wallet]`, solo detectas transacciones en las que la clave pública de esa billetera aparece entre las claves de cuenta de la transacción. Un caso común queda fuera: cuando alguien envía un token SPL (USDC, por ejemplo) a la billetera, la transferencia interactúa con la **cuenta de tokens asociada (ATA)** de la billetera —una dirección independiente derivada por un programa—, no con la clave pública de la billetera.

Por lo tanto, una suscripción simple con `accountInclude: [wallet]` nunca detecta transferencias de tokens entrantes. Tendrías que enumerar de antemano todas las ATA que posee la billetera y agregar cada una al filtro. Sin embargo, las ATA se crean bajo demanda (una por cada mint), así que no puedes conocer el conjunto completo con anticipación.

## Cómo funciona la expansión `tokenAccounts`

Configura `tokenAccounts` en un filtro de transacciones para ampliar la coincidencia, de modo que una billetera incluida en `accountInclude` **también** coincida con las transacciones que interactúan con una cuenta de tokens que posee. La coincidencia se basa en el **propietario**: LaserStream identifica, en el momento de la coincidencia, las cuentas de tokens que poseen tus direcciones de `accountInclude`. Así, detecta cualquier cuenta de tokens que posea la billetera, incluidas las no canónicas, no solo la dirección ATA derivada. Nunca tienes que enumerar las ATA por tu cuenta.

Las suscripciones que omiten `tokenAccounts` se comportan exactamente igual que antes, por lo que puedes agregarlo de forma segura a un filtro existente.

Para buscar coincidencias por token en lugar de por billetera, consulta [Filtrado por mint de token](/docs/es/laserstream/mint-filtering). Las dos opciones se pueden combinar, por lo que un solo filtro puede supervisar la actividad de una billetera específica en un token específico.

## Modos de expansión

`tokenAccounts` acepta uno de tres valores de cadena:

| Valor              | Coincidencias                                                                                                          | Volumen                                      | Úsalo para                                                                                                 |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
| `"balanceChanged"` | Transacciones en las que cambió realmente el saldo de un token propio (o se cerró su cuenta de tokens)                 | Menor — la opción predeterminada recomendada | "Avísame cuando el dinero se mueva realmente" — depósitos, retiros y swaps que se liquidan en la billetera |
| `"all"`            | Cualquier transacción que haga referencia a una cuenta de tokens que posee la billetera, incluso si el saldo no cambió | Mayor                                        | Visibilidad completa de todo lo que llegue a interactuar con las cuentas de tokens de la billetera         |
| `"none"`           | Sin expansión — idéntico a omitir el campo                                                                             | —                                            | La opción predeterminada                                                                                   |

Comienza con `"balanceChanged"`. Captura movimientos reales de fondos con una fracción del volumen de `"all"`.

## Úsalo en LaserStream gRPC

Agrega `tokenAccounts` a un filtro de transacciones en tu `SubscribeRequest`. El [SDK de Helius LaserStream](/docs/es/laserstream/clients) convierte por ti la cadena en la enumeración `TokenAccountExpansionControlFlag` del protocolo (incluida en `yellowstone-grpc-proto` 12.5.0 o posterior).

```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);
});
```

Consulta la [guía de supervisión de transacciones](/docs/es/laserstream/guides/transaction-monitoring) para ver un ejemplo más completo que compara los saldos anteriores y posteriores, y la [referencia de solicitudes de suscripción](/docs/es/laserstream/grpc) para conocer todos los campos de filtro de transacciones.

## Cómo interpretar la coincidencia

Cuando una transacción coincide mediante la expansión de ATA, el movimiento de tokens de la billetera aparece en los campos `meta.postTokenBalances` e `meta.preTokenBalances` de la transacción. Filtra esas entradas por `owner` para aislar los saldos que realmente posee tu billetera. Luego, compara `preTokenBalances` con `postTokenBalances` en el mismo `accountIndex` para ver cuánto se movió de cada mint. El ejemplo anterior muestra el paso de filtrado; la [guía de supervisión de transacciones](/docs/es/laserstream/guides/transaction-monitoring#ejemplo-4-observa-una-billetera-incluidas-las-transferencias-de-tokens) muestra la comparación completa.

## Contenido relacionado

<CardGroup cols={2}>
  <Card title="Transaction Monitoring" icon="receipt" href="/docs/es/laserstream/guides/transaction-monitoring">
    Estrategias completas de filtrado y un ejemplo ejecutable para supervisar una billetera mediante gRPC.
  </Card>

  <Card title="Token Account Filtering (WebSocket)" icon="bolt" href="/docs/es/rpc/websocket/token-account-filtering">
    El mismo campo `tokenAccounts` en el método `transactionSubscribe` de WebSocket.
  </Card>

  <Card title="Subscribe Request Reference" icon="filter" href="/docs/es/laserstream/grpc">
    Todos los campos de filtro de transacciones, incluido `tokenAccounts`.
  </Card>

  <Card title="Compressed Filters" icon="layer-group" href="/docs/es/laserstream/cuckoo-filters">
    Supervisa cientos de miles de cuentas en un solo flujo.
  </Card>

  <Card title="Token Mint Filtering" icon="coins" href="/docs/es/laserstream/mint-filtering">
    Suscríbete a todas las transacciones de un mint de token con `matchMints`.
  </Card>
</CardGroup>
