Démarrage rapide
1
Get Access
Parsed Streams est disponible avec tous les forfaits au tarif de 1 crédit par événement transmis. Obtenez votre clé API depuis le tableau de bord Helius et connectez-vous au point de terminaison Gatekeeper à l’adresse
wss://beta.helius-rpc.com, sur le même hôte que le trafic RPC et WebSocket de Helius.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" :
transactionfournit le contexte complet.feeest exprimé en lamports.accountKeysest la liste complète des clés, y compris celles chargées depuis les tables de recherche d’adresses, dans l’ordre où la chaîne les renvoie.feePayervaut toujoursaccountKeys[0].errorcontient l’erreur de transaction sous forme de JSON structuré, par exemple{"InstructionError": [2, {"Custom": 6001}]}, lorsquestatusvaut"error".summaryprésente la même structure partout où il apparaît : untype(tel queswapoutransfer), undescriptionlisible par l’humain et une charge utileparsedDatastructurée lorsque l’analyseur reconnaît l’action — pour un swap : le protocole, les montants et les mints.transaction.summarydésigne l’action principale de la transaction ; chaque instruction reconnue possède son propresummaryavec la même structure. Pour récupérer tous les swaps d’une transaction, parcourezinstructionset lisezsummary.parsedDatalorsquesummary.typevaut"swap".- Les montants des swaps sont ceux déclarés par la plateforme.
in_amount,actual_out_amountet les montants des swaps internes dansparsedDatacorrespondent aux valeurs déclarées par la plateforme, et non aux montants réellement envoyés ou reçus par le portefeuille de l’utilisateur. Ils ne tiennent pas compte des frais de transfert Token-2022 ni des autres déductions appliquées en dehors du swap. Pour connaître le montant exact reçu, comparez les soldes du compte de tokens de l’utilisateur avant et après la transaction. nativeTransfersettokenTransfersrépertorient les mouvements de SOL et de tokens extraits de l’ensemble de la transaction par l’analyseur, selon la même structure que celle renvoyée par l’API Parsed Events. Les consommateurs du flux et de l’API peuvent ainsi partager le même code de traitement. Les deux champs sont toujours présents, mais peuvent être vides.instructionscontient toutes les instructions de la transaction dans leur ordre d’exécution : chaque instruction de premier niveau suivie de ses instructions internes. Chaque entrée indique sa propre position :instructionIndexdésigne l’instruction de premier niveau à laquelle elle appartient (à partir de 0),innerInstructionIndexindique sa position parmi les appels internes de cette instruction (nullsignifie qu’il s’agit de l’instruction de premier niveau elle-même) etstackHeightcorrespond à la profondeur d’appel (1 pour le premier niveau). Utilisez ces valeurs, et non la position dans le tableau.matchedIndexescontient des indices dansinstructionsqui indiquent les instructions correspondant réellement à votre filtre. Les autres sont fournies à titre contextuel. Avecdetails: "matched", le tableau contient uniquement les correspondances etmatchedIndexesest absent.- Les noms de
decodedutilisent le snake_case (in_amount,user_transfer_authority), conformément à leur publication dans l’IDL du programme. Les arguments entiers sont généralement des chaînes de caractères ("1000000"), car les valeurs u64 ne peuvent pas être représentées par les nombres JavaScript. blockTimevaut actuellement toujoursnull. Ne vous appuyez pas dessus.- Attendez-vous à trouver un mélange d’instructions décodées et non décodées dans une même transaction : un swap entièrement décodé peut côtoyer un mémo non reconnu. Effectuez un branchement selon
decoded: lorsqu’il vautnull, l’instruction contient à la placerawData(octets en base58) etrawAccounts(liste simple de clés publiques), afin que vous disposiez toujours de données exploitables.
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 l’utilisation d’un filtre valide qui ne trouve aucune correspondance, généralement à cause d’un nom d’instruction ou de rôle supposé.describeProgram évite ce problème en renvoyant les noms exacts utilisés par le moteur de correspondance. Cette méthode est actuellement disponible uniquement sur wss://fs-beta.helius-rpc.com/?api-key=<API_KEY>. Envoyez-la donc via une connexion distincte de celle de vos abonnements :
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.