Démarrage rapide
1
Obtenir l'accès
Les Flux Analysés sont en bêta ouverte, disponibles sur les plans payants. Obtenez votre clé API depuis le Tableau de bord Helius et connectez-vous au point de terminaison bêta à
wss://fs-beta.helius-rpc.com.Authentifiez-vous avec la clé API de votre projet, passée en tant que paramètre de requête api-key (ou en tant qu’en-tête x-api-key).2
Connectez-vous
wscat
3
S'abonner avec un filtre
Envoyez La réponse
parsedTransactionSubscribe avec un filtre et des options facultatives :result est un ID d’abonnement entier :4
Lire une notification
Chaque transaction correspondante arrive comme un
parsedTransactionNotification, déjà décodé, avec matchedIndexes pointant vers les instructions que votre filtre a trouvées. Voir Notifications pour la forme complète.5
Se désabonner
Guides
Suivre les échanges Jupiter
Utilisez
describeProgram pour construire un filtre fiable avant de vous abonner.Suivre les Mints Pump.fun
Un écouteur sûr pour la reconnexion qui enregistre chaque nouveau déploiement de token Pump.fun.
Gérer les reconnexions
Survivez aux timeouts et déploiements inactifs, puis comblez précisément ce que vous avez manqué.
Référence du protocole
Les Flux Analysés utilisent JSON-RPC 2.0 sur une connexion WebSocket unique. Chaque requête reçoit une réponse avec le mêmeid. Un abonnement pousse ensuite des messages parsedTransactionNotification jusqu’à ce que vous vous désabonniez ou déconnectiez.
S’abonner
EnvoyezparsedTransactionSubscribe avec un filtre et des options facultatives. La réponse result est un ID d’abonnement entier.
Request
Response
Champs du filtre
Au moins l’un desprograms ou accounts.include est requis. Les champs que vous définissez se combinent avec ET : une instruction doit remplir toutes les conditions pour correspondre.
string[]
IDs de programme à correspondre (adresses base58, pas des noms). Une instruction correspond si son programme est dans cette liste. OU dans la liste.
string[]
Noms d’instruction décodés, tels que
route. Correspondance exacte d’abord, puis insensible à la casse et au séparateur, donc sharedAccountsRoute correspond également au nom sur le fil shared_accounts_route. OU dans la liste. Seules les instructions dont le nom a été identifié dans le catalogue peuvent correspondre, donc prenez les noms de describeProgram.string[]
Adresses des comptes. Une instruction correspond si l’une d’elles apparaît dans sa liste de comptes. OU dans la liste. Fonctionne pour chaque instruction, décodée ou non. L’ID du programme lui-même ne compte pas ici comme un compte.
object
Une carte du nom de rôle de compte décodé à l’adresse, tel que
{ "user_transfer_authority": "<pubkey>" }. Chaque entrée doit être tenue (ET entre les entrées), et l’instruction doit être décodée pour que cela s’applique. Les noms de rôle correspondent exactement, sans conversion de casse, donc copiez-les de describeProgram plutôt que de deviner.boolean
défaut:"false"
Inclure les instructions des transactions échouées.
boolean
défaut:"true"
Les instructions internes (CPI) peuvent correspondre. Réglez
false pour correspondre uniquement aux instructions de premier niveau.-32602 plutôt que silencieusement ignorés, donc les fautes de frappe échouent bruyamment au lieu de ne rien correspondre.
Options
Le second paramètre est facultatif.string
défaut:"confirmed"
Seul
confirmed est pris en charge.string
défaut:"full"
Ce que chaque notification contient.
full : l’ensemble de la transaction, chaque instruction, plus matchedIndexes pointant vers les correspondances du filtre. matched : seulement les instructions qui ont correspondu, sans liste d’index. raw : instructions correspondantes uniquement, réduites à leur position, programId, et blob data en base58, sans champs décodés et sans tableau accountKeys. Utilisez matched quand la bande passante compte plus que le contexte (les charges utiles complètes sont en moyenne environ trois fois plus grandes), et raw lorsque vous décodez les données d’instruction vous-même et que vous avez seulement besoin des octets.Notifications
Une notification par transaction correspondante par abonnement. Avec le défautdetails: "full" :
transactionest le contexte complet.feeest en lamports.accountKeysest la liste complète des clés, y compris les clés chargées à partir de tables de recherche d’adresses, dans le même ordre que la chaîne les rapporte.feePayerest toujoursaccountKeys[0].errortransporte l’erreur de transaction en JSON structuré, par exemple{"InstructionError": [2, {"Custom": 6001}]}, lorsquestatusest"error".summarya une forme unique partout où elle apparaît : untype(tel queswapoutransfer), undescriptionlisible, et une chargeparsedDatastructurée lorsque l’analyseur reconnaît l’action — pour un échange : le protocole, les montants et les mints.transaction.summaryétiquette l’action principale de la transaction ; chaque instruction reconnue porte son propresummaryavec la même forme. Pour collecter chaque échange dans une transaction, itérezinstructionset lisezsummary.parsedDatalorsquesummary.typeest"swap".nativeTransfersettokenTransferslister les mouvements SOL et token extraits par l’analyseur dans la transaction complète, sous la même forme que celle renvoyée par l’API d’Événements Analytiques, afin que les consommateurs de flux et d’API puissent partager le code de traitement. Les deux sont toujours présents, éventuellement vides.instructionsest chaque instruction de la transaction dans l’ordre d’exécution : chaque instruction de premier niveau suivie de ses instructions internes. Chaque entrée porte sa propre position :topIndexest celle à laquelle elle appartient (commençant à 0),innerIndexest sa position parmi les appels internes de cette instruction (nullsignifie qu’il s’agit de l’instruction de premier niveau elle-même), etstackHeightest la profondeur d’appel (1 pour le niveau supérieur). Utilisez ceux-ci, pas la position dans le tableau.matchedIndexessont les indices dansinstructionsvous indiquant lesquels votre filtre a effectivement trouvé. Le reste est là pour le contexte. Avecdetails: "matched"le tableau ne contient que les occurrences etmatchedIndexesest absent.- Les noms
decodedsont en snake_case (in_amount,user_transfer_authority), tels que publiés dans l’IDL du programme. Les arguments entiers sont souvent des chaînes ("1000000") car les valeurs u64 ne rentrent pas dans les nombres JavaScript. blockTimeest actuellement toujoursnull. Ne vous basez pas dessus.- Attendez-vous à un mélange d’instructions décodées et non décodées à l’intérieur d’une même transaction : un échange entièrement décodé peut se trouver à côté d’un mémo non reconnu. Branchez-vous sur
decoded: quand il estnull, l’instruction transporterawData(octets base58) etrawAccounts(liste de clés publiques simples) à la place, vous avez donc toujours quelque chose à travailler avec.
details: "raw" le value se rétrécit au méta de transaction et aux blobs. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes, et tous les champs décodés disparaissent (la transaction summary est toujours incluse); chaque instruction correspondante est sa position, son programme, et ses octets data en base58, exactement comme ils apparaissent sur la chaîne (présent même pour les instructions que le catalogue aurait pu décoder):
Se désabonner
true si l’abonnement existait et était le vôtre. Les notifications s’arrêtent immédiatement. La fermeture de la connexion supprime tous ses abonnements.
Découverte
L’échec le plus courant avec ce type d’API est un filtre qui est valide mais ne correspond à rien, généralement un nom d’instruction ou de rôle deviné.describeProgram empêche cela en renvoyant les noms exacts que le comparateur utilise :
Request
Response
jupiter, et une recherche de nom peut se résoudre à celle plus ancienne). Si vous effectuez une recherche par nom, vérifiez que result.id est le programme auquel vous avez l’intention de vous abonner.
Flux recommandé : describeProgram pour obtenir les noms exacts d’instruction et de rôle, construisez le filtre avec ces noms, puis abonnez-vous. Le guide Suivre les échanges Jupiter explique cela de bout en bout.
Limites
Erreurs
Les erreurs suivent JSON-RPC 2.0 :{ "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Les messages indiquent exactement ce qui était incorrect et où.
Les connexions peuvent également se fermer avec un code de fermeture WebSocket — voir Gestion des reconnexions pour savoir ce que chacun signifie et comment récupérer.