Skip to main content
Novo em Streams Analisados? Leia o modelo mental primeiro — ele explica por que os filtros são como são.

Início Rápido

1

Obter Acesso

Streams Analisados está em beta fechado. A equipe Helius coloca seu ID de projeto na lista branca e compartilha o endpoint de conexão com você. Para participar do beta fechado, inscreva-se aqui.Autentique-se com a chave de API do seu projeto, passada como o parâmetro de consulta api-key (ou o cabeçalho x-api-key).
2

Conectar

wscat
Uma chave ausente, inválida ou não incluída na lista branca é rejeitada com HTTP 401. Um projeto no limite de conexão recebe HTTP 429.
3

Assine com um Filtro

Envie parsedTransactionSubscribe com um filtro e opções opcionais:
A resposta result é um inteiro id de assinatura:
4

Leia uma Notificação

Cada transação correspondente chega como um parsedTransactionNotification, já decodificado, com matchedIndexes apontando para as instruções que seu filtro atingiu. Veja Notificações para o formato completo.
5

Cancelar Assinatura

Ou simplesmente feche a conexão — isso remove todas as suas assinaturas.

Guias

Acompanhe Trocas Jupiter

Use describeProgram para construir um filtro confiável antes de assinar.

Acompanhe Mints do Pump.fun

Um ouvinte seguro para reconexões que registra cada novo deploy de token Pump.fun.

Lidando com Reconexões

Sobreviva a timeouts de inatividade e implantações, depois recupere exatamente o que perdeu.

Referência do Protocolo

Streams Analisados usa JSON-RPC 2.0 sobre uma única conexão WebSocket. Cada solicitação recebe uma resposta com o mesmo id. Uma assinatura então envia mensagens parsedTransactionNotification até você cancelar a assinatura ou desconectar.

Inscrever-se

Envie parsedTransactionSubscribe com um filtro e opções opcionais. A resposta result é um inteiro id de assinatura.
Request
Response

Campos de Filtro

Pelo menos um de programs ou accounts.include é necessário. Os campos que você define se combinam com E: uma instrução deve satisfazer todos eles para corresponder.
string[]
IDs dos Programas para corresponder (endereços base58, não nomes). Uma instrução corresponde se seu programa estiver nesta lista. OU dentro da lista.
string[]
Nomes de instruções decodificadas, como route. Correspondido exatamente primeiro, depois com uma diferença insensível a maiúsculas e separadores, então sharedAccountsRoute também corresponde ao nome da rede shared_accounts_route. OU dentro da lista. Apenas instruções cujo nome o catálogo pôde identificar podem corresponder, então pegue nomes de describeProgram.
string[]
Endereços de contas. Uma instrução corresponde se algum destes aparecer em sua lista de contas. OU dentro da lista. Funciona para todas as instruções, decodificadas ou não. O ID do programa em si não conta como uma conta aqui.
object
Um mapa do nome do papel da conta decodificado para o endereço, como { "user_transfer_authority": "<pubkey>" }. Cada entrada deve ser válida (E entre entradas), e a instrução deve estar decodificada para que isso se aplique. Nomes de papéis correspondem exatamente, sem distinção de maiúsculas, então copie-os de describeProgram em vez de adivinhar.
boolean
padrão:"false"
Incluir instruções de transações falhadas.
boolean
padrão:"true"
Instruções internas (CPI) são elegíveis para corresponder. Defina false para corresponder apenas a instruções de nível superior.
Campos desconhecidos em qualquer lugar no filtro ou opções são rejeitados com -32602 em vez de ignorados silenciosamente, então erros de digitação falham ruidosamente em vez de não corresponder a nada.

Opções

O segundo parâmetro é opcional.
string
padrão:"confirmed"
Apenas confirmed é suportado.
string
padrão:"full"
O que cada notificação carrega. full: a transação inteira, cada instrução, além de matchedIndexes apontando para os acertos do filtro. matched: apenas as instruções que corresponderam, sem lista de índice. raw: apenas instruções correspondidas, cada uma reduzida à sua posição, programId, e blob base58 data, sem campos decodificados e sem matriz accountKeys. Use matched quando a largura de banda for mais importante que o contexto (cargas completas são, em média, aproximadamente três vezes o tamanho), e raw quando você decodificar dados de instrução por conta própria e só precisar dos bytes.
Um projeto pode ter até 100 conexões simultâneas, compartilhadas entre todas as suas chaves de API.

Notificações

Uma notificação por transação correspondente por assinatura. Com o padrão details: "full":
Lendo-o:
  • transaction é o contexto completo. fee está em lamports. accountKeys é a lista completa de chaves, incluindo chaves carregadas de tabelas de pesquisa de endereço, na mesma ordem em que a rede as relata. feePayer é sempre accountKeys[0]. error carrega o erro da transação como JSON estruturado, por exemplo {"InstructionError": [2, {"Custom": 6001}]}, quando status é "error".
  • summary tem uma forma em todo lugar que aparece: um type (como swap ou transfer), um description legível por humanos e uma carga parsedData estruturada quando o analisador reconhece a ação — para uma troca: o protocolo, valores e mints. transaction.summary rotula a ação principal da transação; cada instrução reconhecida carrega seu próprio summary com a mesma forma. Para coletar toda troca em uma transação, percorra instructions e leia summary.parsedData onde summary.type é "swap".
  • nativeTransfers e tokenTransfers listam os movimentos de SOL e tokens que o analisador extraiu de toda a transação, na mesma forma que a API de Eventos Analisados retorna, para que consumidores de stream e API possam compartilhar código de processamento. Ambos estão sempre presentes, possivelmente vazios.
  • instructions é cada instrução da transação em ordem de execução: cada instrução de nível superior seguida por suas instruções internas. Cada entrada carrega sua própria posição: topIndex é a qual instrução de nível superior pertence (começando em 0), innerIndex é sua posição entre as chamadas internas daquela instrução (null significa que é a própria instrução de nível superior), e stackHeight é a profundidade da chamada (1 para nível superior). Use esses, não a posição do array.
  • matchedIndexes são índices em instructions dizendo quais seu filtro realmente atingiu. O resto está lá para contexto. Com details: "matched" o array contém apenas os acertos e matchedIndexes está ausente.
  • Nomes decoded são snake_case (in_amount, user_transfer_authority), conforme publicado no IDL do programa. Argumentos inteiros são comumente strings ("1000000") porque valores u64 não cabem em números JavaScript.
  • blockTime está atualmente sempre null. Não construa em cima disso.
  • Espere uma mistura de instruções decodificadas e não decodificadas dentro de uma transação: uma troca totalmente decodificada pode estar ao lado de um memo não reconhecido. Divida em decoded: quando é null, a instrução carrega rawData (bytes base58) e rawAccounts (lista de pubkey simples) em vez disso, então você sempre terá algo com que trabalhar.
Com details: "raw" o value reduz-se a meta da transação e blobs. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes, e todos os campos decodificados estão ausentes (a transação summary ainda está incluída); cada instrução correspondida é sua posição, seu programa e seus bytes data em base58, exatamente como aparecem na cadeia (presentes mesmo para instruções que o catálogo poderia ter decodificado):

Cancelar Assinatura

Retorna true se a assinatura existia e era sua. As notificações param imediatamente. Fechar a conexão remove todas as suas assinaturas.

Descoberta

O erro mais comum com esse tipo de API é um filtro que é válido mas não corresponde a nada, geralmente um nome de instrução ou papel adivinhado. describeProgram previne isso retornando os nomes exatos que o comparador verifica:
Request
Response
Você pode passar um endereço de programa ou um nome de catálogo, mas prefira o endereço: nomes podem ser ambíguos entre versões de programas (mais de uma entrada de catálogo é nomeada jupiter, e uma busca por nome pode resolver para a mais antiga). Se você fizer a busca por nome, verifique se result.id é o programa que você pretende assinar. Fluxo recomendado: describeProgram para obter os nomes exatos de instrução e papel, construa o filtro com esses nomes, depois assine. O guia Acompanhe Trocas Jupiter percorre isso do início ao fim.

Limites

Erros

Erros seguem JSON-RPC 2.0: { "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Mensagens dizem exatamente o que estava errado e onde. Conexões também podem fechar com um código de fechamento WebSocket — veja Lidando com Reconexões para o que cada um significa e como se recuperar.

Exemplos de Cliente