Skip to main content
Neu bei Parsed Streams? Lesen Sie zuerst das mentale Modell — es erklärt, warum Filter so aussehen, wie sie aussehen.

Schnellstart

1

Zugang erhalten

Parsed Streams befindet sich in der offenen Beta und ist in kostenpflichtigen Plänen verfügbar. Holen Sie sich Ihren API-Schlüssel vom Helius-Dashboard und verbinden Sie sich mit dem Beta-Endpunkt unter wss://fs-beta.helius-rpc.com.Authentifizieren Sie sich mit dem API- Schlüssel Ihres Projekts, der als api-key-Abfrageparameter (oder im x-api-key-Header) übergeben wird.
2

Verbinden

wscat
Ein fehlender oder ungültiger Schlüssel wird mit HTTP 401 abgelehnt. Ein Projekt mit aktiver Verbindung erhält HTTP 429.
3

Mit einem Filter abonnieren

Senden Sie parsedTransactionSubscribe mit einem Filter und optionalen Optionen:
Die Antwort result ist eine ganze Zahl Abonnement-ID:
4

Eine Benachrichtigung lesen

Jede passende Transaktion wird als ein parsedTransactionNotification empfangen, bereits dekodiert, wobei matchedIndexes auf die Anweisungen verweist, die Ihr Filter getroffen hat. Siehe Benachrichtigungen für die vollständige Form.
5

Abmelden

Oder schließen Sie einfach die Verbindung — dadurch werden alle Abonnements entfernt.

Anleitungen

Jupiter Swaps verfolgen

Verwenden Sie describeProgram, um einen vertrauenswürdigen Filter zu erstellen, bevor Sie abonnieren.

Pump.fun Mints verfolgen

Ein wiederverbindungs-sicherer Listener, der jede neue Pump.fun Tokenbereitstellung protokolliert.

Reconnects handhaben

Überleben Sie Leerlauf-Timeouts und Deployments und füllen Sie dann genau das nach, was Sie verpasst haben.

Protokollreferenz

Parsed Streams verwendet JSON-RPC 2.0 über eine einzelne WebSocket-Verbindung. Jede Anfrage erhält eine Antwort mit demselben id. Ein Abonnement sendet dann parsedTransactionNotification-Nachrichten, bis Sie sich abmelden oder die Verbindung trennen.

Abonnieren

Senden Sie parsedTransactionSubscribe mit einem Filter und optionalen Optionen. Die Antwort result ist eine ganze Zahl Abonnement-ID.
Request
Response

Filterfelder

Mindestens eine von programs oder accounts.include ist erforderlich. Die von Ihnen festgelegten Felder werden mit UND kombiniert: Eine Anweisung muss alle erfüllen, um übereinzustimmen.
string[]
Programm-IDs zum Abgleichen (Base58-Adressen, keine Namen). Eine Anweisung stimmt überein, wenn ihr Programm in dieser Liste enthalten ist. ODER innerhalb der Liste.
string[]
Dekodierte Anweisungsnamen, wie etwa route. Zuerst genau abgeglichen, dann mit einem Fall- und Trennzeichen- unsensitiven Fallback, sodass sharedAccountsRoute auch dem Drahtnamen shared_accounts_route entspricht. ODER innerhalb der Liste. Nur Anweisungen, deren Namen der Katalog identifizieren konnte, können übereinstimmen, also nehmen Sie Namen von describeProgram.
string[]
Konto-Adressen. Eine Anweisung stimmt überein, wenn eines dieser Konten in ihrer Kontoliste erscheint. ODER innerhalb der Liste. Funktioniert für jede Anweisung, dekodiert oder nicht. Die Programm-ID selbst zählt hier nicht als Konto.
object
Eine Zuordnung von dekodierten Kontorollennamen zu Adressen, wie etwa { "user_transfer_authority": "<pubkey>" }. Jeder Eintrag muss gelten (UND über Einträge hinweg), und die Anweisung muss dekodiert sein, damit dies gilt. Rollennamen passen genau, ohne Berücksichtigung des Falls, also kopieren Sie diese von describeProgram, anstatt zu raten.
boolean
Standard:"false"
Beinhaltet Anweisungen aus fehlgeschlagenen Transaktionen.
boolean
Standard:"true"
Innere (CPI) Anweisungen können übereinstimmen. Setzen Sie false, um nur Top-Level-Anweisungen zu treffen.
Unbekannte Felder irgendwo im Filter oder in den Optionen werden mit -32602 abgelehnt, anstatt stillschweigend ignoriert zu werden, sodass Tippfehler laut fehlschlagen, anstatt nichts zu treffen.

Optionen

Der zweite Parameter ist optional.
string
Standard:"confirmed"
Nur confirmed wird unterstützt.
string
Standard:"full"
Was jede Benachrichtigung enthält. full: die gesamte Transaktion, jede Anweisung, plus matchedIndexes, die auf die Filtertreffer zeigt. matched: nur die übereinstimmenden Anweisungen, keine Indexliste. raw: nur übereinstimmende Anweisungen, jede reduziert auf ihre Position, programId, und Base58 data Blob, ohne dekodierte Felder und ohne accountKeys Array. Verwenden Sie matched, wenn die Bandbreite wichtiger ist als der Kontext (vollständige Nutzlasten sind im Durchschnitt etwa dreimal so groß), und raw, wenn Sie Anweisungsdaten selbst dekodieren und nur die Bytes benötigen.
Ein Projekt kann bis zu 100 gleichzeitige Verbindungen halten, die auf alle seine API-Schlüssel verteilt sind.

Benachrichtigungen

Eine Benachrichtigung pro passender Transaktion pro Abonnement. Mit dem Standard details: "full":
Lesen:
  • transaction ist der vollständige Kontext. fee ist in Lamports. accountKeys ist die vollständige Schlüsselliste, einschließlich der von Adresssuchtabellen geladenen Schlüssel, in der Reihenfolge, in der die Kette sie meldet. feePayer ist immer accountKeys[0]. error enthält den Transaktionsfehler als strukturiertes JSON, zum Beispiel {"InstructionError": [2, {"Custom": 6001}]}, wenn status "error" ist.
  • summary hat überall die gleiche Form: ein type (wie swap oder transfer), ein lesbarer description und eine strukturierte parsedData Nutzlast, wenn der Parser die Aktion erkennt — für einen Swap: das Protokoll, Mengen und Mints. transaction.summary kennzeichnet die Hauptaktion der Transaktion; jede erkannte Anweisung enthält ihre eigene summary mit der gleichen Form. Um jeden Swap in einer Transaktion zu sammeln, iterieren Sie instructions und lesen Sie summary.parsedData, wo summary.type "swap" ist.
  • nativeTransfers und tokenTransfers listen die SOL- und Token-Bewegungen auf, die der Parser aus der gesamten Transaktion extrahiert hat, in derselben Form, die die Parsed Events API zurückgibt, damit Stream- und API-Konsumenten denselben Verarbeitungscode teilen können. Beide sind immer vorhanden, möglicherweise leer.
  • instructions ist jede Anweisung der Transaktion in Ausführungsreihenfolge: jede oberste Anweisung, gefolgt von ihren inneren Anweisungen. Jeder Eintrag enthält seine eigene Position: topIndex gibt an, zu welcher obersten Anweisung er gehört (beginnend bei 0), innerIndex ist seine Position unter den inneren Aufrufen dieser Anweisung (null bedeutet, dass es die oberste Anweisung selbst ist) und stackHeight ist die Aufruftiefe (1 für oberstes Niveau). Verwenden Sie diese, nicht die Array-Position.
  • matchedIndexes sind Indizes in instructions, die Ihnen sagen, welche Ihre Filter tatsächlich getroffen haben. Der Rest ist für den Kontext da. Mit details: "matched" enthält das Array nur die Treffer und matchedIndexes ist abwesend.
  • decoded Namen sind snake_case (in_amount, user_transfer_authority), wie sie im IDL des Programms veröffentlicht sind. Ganzzahl-Argumente sind häufig Zeichenfolgen ("1000000"), da u64-Werte nicht in JavaScript-Zahlen passen.
  • blockTime ist derzeit immer null. Nicht darauf verlassen.
  • Erwarten Sie eine Mischung aus dekodierten und undekodierten Anweisungen innerhalb einer Transaktion: ein vollständig dekodierter Swap kann neben einem nicht erkannten Memo stehen. Verzweigen Sie nach decoded: Wenn es null ist, trägt die Anweisung rawData (Base58-Bytes) und rawAccounts (einfache Pubkey-Liste) stattdessen, so dass Sie immer etwas zum Arbeiten haben.
Mit details: "raw" schrumpft das value auf Transaktionsmeta und Blobs. accountKeys, nativeTransfers, tokenTransfers, matchedIndexes und alle dekodierten Felder sind weg (die Transaktion summary ist noch enthalten); jede übereinstimmende Anweisung entspricht ihrer Position, ihrem Programm und ihren data Bytes in Base58, genau so, wie sie auf der Kette erscheinen (auch für Anweisungen vorhanden, die der Katalog hätte dekodieren können):

Abmelden

Gibt true zurück, wenn das Abonnement existierte und Ihnen gehörte. Benachrichtigungen stoppen sofort. Das Schließen der Verbindung entfernt alle ihre Abonnements.

Entdeckung

Der häufigste Fehler bei dieser Art von API ist ein Filter, der gültig ist, aber nichts trifft, normalerweise ein geschätzter Anweisungs- oder Rollename. describeProgram verhindert dies, indem es die genauen Namen zurückgibt, mit denen der Matcher vergleicht:
Request
Response
Sie können eine Programmadresse oder einen Katalognamen übergeben, aber bevorzugen Sie die Adresse: Namen können zwischen Programmversionen mehrdeutig sein (mehr als ein Katalogeintrag trägt den Namen jupiter, und eine Namenssuche kann zum älteren führen). Wenn Sie nach Namen nachschlagen, überprüfen Sie, ob result.id das Programm ist, das Sie abonnieren möchten. Empfohlener Ablauf: describeProgram, um die genauen Anweisungs- und Rollennamen zu erhalten, den Filter mit diesen Namen erstellen und dann abonnieren. Der Leitfaden Jupiter Swaps verfolgen führt Sie von Anfang bis Ende durch diesen Prozess.

Grenzen

Fehler

Fehler folgen JSON-RPC 2.0: { "error": { "code": <int>, "message": "<text>" }, "id": <id> }. Nachrichten geben genau an, was falsch war und wo. Verbindungen können auch mit einem WebSocket-Schließcode geschlossen werden — siehe Reconnects handhaben für die Bedeutung jedes Codes und wie Sie sich erholen können.

Client-Beispiele