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

# Transmissão de Dados Solana Pump AMM com LaserStream

> Script LaserStream copiável que transmite a atividade de conta e transações do Pump.fun em tempo real, com estatísticas contínuas e decodificação de assinaturas.

Transmita cada atualização de conta e transação do Pump.fun em tempo real usando o [SDK LaserStream](/docs/pt-BR/laserstream/clients). Esta página percorre um script completo em TypeScript que você pode executar de ponta a ponta: ele imprime cada transação à medida que acontece, relata estatísticas contínuas (taxa de transferência, pagantes de taxas únicos, taxas totais em SOL) uma vez por minuto e permanece conectado automaticamente durante reconexões.

É um ponto de partida útil para qualquer coisa que precise de visibilidade contínua do Pump.fun — bots de negociação, painéis analíticos, pipelines de alerta ou apenas explorar o formato dos dados para que você possa construir algo mais especializado em cima.

<Info>
  **Pré-requisitos:** Uma [chave API Helius](https://dashboard.helius.dev/) (Plano Business ou Professional para Mainnet LaserStream) e Node.js 18+. Familiaridade com [Assinaturas de Conta](/docs/pt-BR/laserstream/guides/account-subscription) e [Monitoramento de Transações](/docs/pt-BR/laserstream/guides/transaction-monitoring) ajuda, mas não é obrigatório.
</Info>

***

## Configuração

Crie um projeto novo, instale o SDK + `bs58` (usado para decodificar assinaturas de transações) e defina sua chave API:

```bash theme={"system"}
mkdir pump-monitor && cd pump-monitor
npm init -y
npm install helius-laserstream bs58
npm install --save-dev typescript ts-node @types/node
npx tsc --init
export HELIUS_API_KEY=your-key-here
```

Escolha o endpoint mais próximo de onde este script será executado — veja as [regiões LaserStream](/docs/pt-BR/laserstream/grpc#mainnet-endpoints).

***

## O script

Salve isso como `index.ts`, então execute `npx ts-node index.ts`:

```typescript [expandable] theme={"system"}
import { subscribe, CommitmentLevel, LaserstreamConfig, SubscribeRequest } from 'helius-laserstream';
import bs58 from 'bs58';

const PUMP_PROGRAM_ID = '6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P';

// Rolling stats across the session.
const stats = {
  startedAt: Date.now(),
  transactions: 0,
  successes: 0,
  failures: 0,
  uniquePayers: new Set<string>(),
  totalFeesLamports: 0,
  accountUpdates: 0,
};

async function handleUpdate(data: any) {
  if (data.transaction) {
    const tx = data.transaction.transaction;
    if (!tx) return;

    stats.transactions++;
    const failed = !!tx.meta?.err;
    failed ? stats.failures++ : stats.successes++;

    // tx.meta.fee is a u64 string — coerce before adding.
    stats.totalFeesLamports += Number(tx.meta?.fee ?? 0);

    // Fee payer is the first account in the message.
    const firstKey = tx.transaction?.message?.accountKeys?.[0];
    if (firstKey) {
      const payer = typeof firstKey === 'string' ? firstKey : bs58.encode(firstKey);
      stats.uniquePayers.add(payer);
    }

    // tx.signature is a Buffer in the SDK.
    const sig = bs58.encode(tx.signature);
    const slot = data.transaction.slot;
    const flag = failed ? '❌' : '✅';
    console.log(`${flag}  ${sig.slice(0, 12)}…  slot ${slot}  fee ${tx.meta?.fee} lamports`);
  }

  if (data.account) {
    stats.accountUpdates++;
    const acct = data.account.account;
    const pubkey = typeof acct.pubkey === 'string' ? acct.pubkey : bs58.encode(acct.pubkey);
    console.log(`📋  account ${pubkey}  ${acct.data?.length ?? 0} bytes`);
  }
}

function printReport() {
  const minutes = (Date.now() - stats.startedAt) / 60_000;
  console.log('\n📊  Pump.fun activity report');
  console.log(`   Runtime:           ${minutes.toFixed(1)} min`);
  console.log(`   Transactions:      ${stats.transactions} (${stats.successes} ok, ${stats.failures} failed)`);
  console.log(`   Throughput:        ${(stats.transactions / Math.max(minutes, 0.0001)).toFixed(1)} tx/min`);
  console.log(`   Unique fee payers: ${stats.uniquePayers.size}`);
  console.log(`   Total fees:        ${(stats.totalFeesLamports / 1e9).toFixed(4)} SOL`);
  console.log(`   Account updates:   ${stats.accountUpdates}\n`);
}

async function main() {
  const config: LaserstreamConfig = {
    apiKey: process.env.HELIUS_API_KEY ?? 'YOUR_API_KEY',
    endpoint: 'https://laserstream-mainnet-ewr.helius-rpc.com', // pick the region closest to you
  };

  const subscriptionRequest: SubscribeRequest = {
    accounts: {
      'pump-accounts': {
        account: [],
        owner: [PUMP_PROGRAM_ID],
        filters: [],
      },
    },
    transactions: {
      'pump-transactions': {
        accountInclude: [PUMP_PROGRAM_ID],
        accountExclude: [],
        accountRequired: [],
        vote: false,
        failed: false,
      },
    },
    commitment: CommitmentLevel.CONFIRMED,
    slots: {},
    transactionsStatus: {},
    blocks: {},
    blocksMeta: {},
    entry: {},
    accountsDataSlice: [],
  };

  console.log('🚀  Streaming Pump.fun activity. Press Ctrl+C to stop.\n');

  const reportTimer = setInterval(printReport, 60_000);
  process.on('SIGINT', () => {
    clearInterval(reportTimer);
    printReport();
    process.exit(0);
  });

  await subscribe(config, subscriptionRequest, handleUpdate, async (error) => {
    console.error('Stream error:', error);
  });
}

main().catch(console.error);
```

***

## O que o script faz

### Uma assinatura, dois blocos de filtro

Uma única chamada `subscribe(...)` carrega dois grupos de filtros nomeados:

* O filtro **`accounts`** recebe cada conta pertencente ao programa Pump.fun (curvas de vínculo, estado de mint, etc.) sempre que seus dados mudam.
* O filtro **`transactions`** recebe cada transação que interage com o programa Pump.fun. Os flags `vote: false, failed: false` descartam votos e transações falhadas antes que atinjam seu manipulador.

Ambos chegam por um único stream gRPC, então o SDK só precisa gerenciar uma conexão. Se cair, o SDK reconecta automaticamente e você continua recebendo atualizações de ambos os filtros.

### Lendo os campos brutos

Alguns valores no payload precisam de uma pequena conversão antes de serem fáceis de usar:

* **`tx.signature`** é um [`Buffer`](https://nodejs.org/api/buffer.html). Passe-o por `bs58.encode(...)` para obter a assinatura base58 que você veria em um explorador ou em uma resposta `getTransaction`.
* **`tx.meta.fee`** é um u64 armazenado como string, para que valores acima de `Number.MAX_SAFE_INTEGER` não percam precisão em JavaScript. Envolva-o em `Number(...)` antes de fazer aritmética. A mesma convenção string-para-u64 se aplica a vários campos de nível de bloco também — veja [Monitoramento de Slot & Bloco](/docs/pt-BR/laserstream/guides/slot-and-block-monitoring) para o formato completo dos dados.

### Estatísticas contínuas

Um `setInterval` imprime um instantâneo a cada 60 segundos: total de transações, sucessos versus falhas, taxa de transferência, pagantes de taxas únicos e taxas totais em SOL. Pressione `Ctrl+C` para um último instantâneo antes que o script termine.

***

## Estendendo o script

Algumas direções para expandir isso:

* **Decodifique discriminadores de instrução** para rotular transações como `buy` / `sell` / `create` — veja [Decodificando Dados de Transação](/docs/pt-BR/laserstream/guides/decoding-transaction-data) para o padrão de análise.
* **Persista** as estatísticas contínuas em um banco de dados (Postgres, Redis, ClickHouse) em vez de em memória `Set` / contadores.
* **Alerta** sobre limites — grandes pagadores de taxas, picos de volume súbitos, novas contas de curva de vínculo.
* **Reproduza** a atividade perdida na inicialização definindo `fromSlot` em `SubscribeRequest` (até 24 horas atrás — veja [Reprodução Histórica](/docs/pt-BR/laserstream/historical-replay)).
* **Combine** com [Monitoramento de Slot & Bloco](/docs/pt-BR/laserstream/guides/slot-and-block-monitoring) para contexto em nível de bloco.

***

## Próximos Passos

<CardGroup cols={2}>
  <Card title="Monitoramento de Transações" icon="receipt" href="/docs/pt-BR/laserstream/guides/transaction-monitoring">
    Os padrões gerais de filtragem de transações que este script usa.
  </Card>

  <Card title="Decodificando Dados de Transação" icon="binary" href="/docs/pt-BR/laserstream/guides/decoding-transaction-data">
    Analise o payload binário da transação em transações Solana legíveis.
  </Card>

  <Card title="Assinaturas de Conta" icon="user" href="/docs/pt-BR/laserstream/guides/account-subscription">
    Observe mudanças específicas no estado da conta com filtros.
  </Card>

  <Card title="Reprodução Histórica" icon="clock-rotate-left" href="/docs/pt-BR/laserstream/historical-replay">
    Reproduza até 24h da atividade passada do Pump.fun a partir de um slot inicial.
  </Card>
</CardGroup>
