Übersicht
Die StreamL4BookUpdates stream delivers typed order-level book changes as NEW, UPDATE, und REMOVE diffs for one or more coins. It gives clients per-order L4 movement without consuming full L4 book snapshots every block, and without parsing JSON-encoded payloads: every diff is a strongly typed protobuf message.
gRPC : OrderBookStreaming
gRPC : StreamL4BookUpdates
Modell aktualisieren: Full reset snapshot on subscribe and for mid-stream replacement resets, then typed per-order diffs per block
So funktioniert es
- Beim Abonnieren: The first message has
snapshot: trueand contains every resting order as aL4_ORDER_DIFF_TYPE_NEWdiff, a full reset snapshot of the book - Danach pro Block: Each
L4BookUpdatesUpdatecontains typed diffs for orders that changed:NEW(order entered the book),UPDATE(order size changed),REMOVE(order left the book,szis omitted) - Apply diffs to a local order map keyed by
oidto maintain the current book - Replacement resets: Any later message can also have
snapshot: true, for example when an ALO priority fee insertion changes queue order or when stream state is rebuilt. Whenever a message hassnapshot: true, clear the keyed local order state before applying its diffs, not only on the first message
Unlike StreamL4Book, which sends diffs as a JSON-encoded Daten string, every field here is a typed protobuf field, so no secondary JSON parsing is required. A single stream can cover multiple coins (or all coins with an empty coins list).
Datenstruktur
Each L4BookUpdatesUpdate message contains the typed diffs for one block:
{
"time": 1781109115476,
"height": 586405189,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "ETH", "oid": 54764586686,
"user": "0x768484F7e2EBB675C57838366C02Ae99ba2A9B08", "side": "B", "px": "1649.1", "sz": "1.022" }
]
}
Anfrageparameter
| Feld | Typ | Erforderlich | Beschreibung |
|---|---|---|---|
| coins | repeated string | Nein | List of symbols to subscribe to (e.g., "BTC", "ETH"). Empty means all coins |
Benennung von Münzen
Die coins Der Parameter folgt der Namenskonvention Hyperliquid, die Perpetuals eindeutig vom Spot unterscheidet:
- Unbefristete Verträge: Human-readable names, such as
„BTC“,„ETH“,„HYPE“,„SOL“ - Spot-Token:
@{index}format, such as"@1",„@107“,"@142","@166" - Ergebnismärkte (HIP-4):
#NFormat. Jedes Ergebnis hat zwei#Ncoins, one per side (Yes and No). Multi-price question markets consist of multiple grouped outcomes (price buckets plus a fallback), each with its own Yes/No coin pair. Use theoutcomeMetaendpoint Zuordnung von Münzindizes zu Marktbezeichnungen und Seiten. - Ausnahme:
„PURR/USDC“ist die einzige Spot-Münze, auf der ein Name zu lesen ist
Es gibt keine Überschneidungen zwischen den Formaten. „BTC“ bezieht sich immer auf den BTC-Perpetual-Kontrakt; der Spot-BTC ist "@142". Um zu entdecken @index Zuordnungen für Spot-Token, Abfrage der Meta oder spotMeta Info-Endpunkte.
Antwortfelder
L4BookUpdatesUpdate
| Feld | Typ | Beschreibung |
|---|---|---|
| Zeit | uint64 | Block-Zeitstempel in Millisekunden |
| Höhe | uint64 | Blockhöhe |
| Momentaufnahme | bool | True when the diffs carry a full reset snapshot of all resting orders (sent on subscribe and for mid-stream replacement resets) |
| diffs | L4OrderDiff[] | Typed per-order diffs for this block |
L4OrderDiff
| Feld | Typ | Beschreibung |
|---|---|---|
| diff_type | L4OrderDiffType | L4_ORDER_DIFF_TYPE_NEW (order entered the book), L4_ORDER_DIFF_TYPE_UPDATE (order size changed), or L4_ORDER_DIFF_TYPE_REMOVE (order left the book) |
| Münze | Zeichenkette | Symbol (z. B. „BTC“, „ETH“) |
| oid | uint64 | Eindeutige Bestell-ID |
| Benutzer | Zeichenkette | Ethereum des Auftraggebers |
| Seite | Zeichenkette | „A“ (Ask/Verkaufen) oder „B“ (Bid/Kaufen) |
| px | Zeichenkette | Order price as a decimal string |
| sz | Zeichenkette | New/current order size for NEW and UPDATE diffs. Omitted on REMOVE |
Proto-Definition
StreamL4BookUpdates ist definiert in orderbook.proto:
service OrderBookStreaming {
rpc StreamL4BookUpdates (L4BookUpdatesRequest) returns (stream L4BookUpdatesUpdate);
}
message L4BookUpdatesRequest {
repeated string coins = 1;
}
enum L4OrderDiffType {
L4_ORDER_DIFF_TYPE_UNSPECIFIED = 0;
L4_ORDER_DIFF_TYPE_NEW = 1;
L4_ORDER_DIFF_TYPE_UPDATE = 2;
L4_ORDER_DIFF_TYPE_REMOVE = 3;
}
message L4BookUpdatesUpdate {
uint64 time = 1;
uint64 height = 2;
repeated L4OrderDiff diffs = 3;
bool snapshot = 4;
}
message L4OrderDiff {
L4OrderDiffType diff_type = 1;
string coin = 2;
uint64 oid = 3;
string user = 4;
string side = 5;
string px = 6;
string sz = 7;
}
Beispiele für Aktualisierungen
Initial Snapshot (first message, truncated)
The first message has snapshot: true and contains every resting order as a NEW diff. Later messages can also carry snapshot: true as a replacement reset; handle each one the same way:
{
"time": 1781109063794,
"height": 586404872,
"snapshot": true,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "BTC", "oid": 54764492622,
"user": "0x039442e06b482Bf01A1a65742cf061bD73A80f31", "side": "B", "px": "62963", "sz": "0.00009" },
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "BTC", "oid": 54764537698,
"user": "0x3643290CD5DE72b37d2f10A351Ce57c30d103969", "side": "B", "px": "62963", "sz": "0.00024" },
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "BTC", "oid": 54764482173,
"user": "0x4547B9E33F07965711f67d0bE2423939A4E33aF5", "side": "B", "px": "62955", "sz": "0.00015" }
]
}
Per-Block Update with Removals
sz is omitted on REMOVE diffs:
{
"time": 1781109083796,
"height": 586404997,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_REMOVE", "coin": "BTC", "oid": 54764554671,
"user": "0xc64cc00B46101bd40aA1C3121195E85c0B0918d8", "side": "B", "px": "62389.0" },
{ "diff_type": "L4_ORDER_DIFF_TYPE_REMOVE", "coin": "BTC", "oid": 54764557274,
"user": "0xc64cc00B46101bd40aA1C3121195E85c0B0918d8", "side": "B", "px": "62421.0" }
]
}
New Order and Size Update
A new order entering the book:
{
"time": 1781109115476,
"height": 586405189,
"diffs": [
{ "diff_type": "L4_ORDER_DIFF_TYPE_NEW", "coin": "ETH", "oid": 54764586686,
"user": "0x768484F7e2EBB675C57838366C02Ae99ba2A9B08", "side": "B", "px": "1649.1", "sz": "1.022" }
]
}
A size change on a resting order (sz is the new current size):
{ "diff_type": "L4_ORDER_DIFF_TYPE_UPDATE", "coin": "ETH", "oid": 54764551695,
"user": "0x4547B9E33F07965711f67d0bE2423939A4E33aF5", "side": "B", "px": "1702.9", "sz": "0.0032" }
API-Nutzung
gRPC
// Single coin
const request = {
coins: ['BTC']
};
// Multiple coins in one stream
const multiRequest = {
coins: ['BTC', 'ETH']
};
// All coins
const allCoinsRequest = {
coins: []
};
StreamL4BookUpdates ist nur über die gRPC -API verfügbar (OrderBookStreaming Dienst). Er ist nicht über JSON-RPC oder WebSocket verfügbar.
Comparison: L4 Book Updates vs L4 Book vs Book Updates Dataset
| Funktion | StreamL4BookUpdates | StreamL4Book | BUCH_AKTUELLES |
|---|---|---|---|
| Granularität | Individual orders, typed diffs | Einzelbestellungen | Einzelne Abweichungen auf Auftragsebene |
| Diff encoding | Typed protobuf (NEW/UPDATE/REMOVE) | JSON-encoded data string | JSON objects |
| Beinhaltet den aktuellen Stand | Yes (reset snapshot as NEW diffs) | Yes (initial snapshot) | No (forward-only) |
| Erfordert REST-Bootstrap | Nein | Nein | Ja |
| Coins per stream | Multiple (or all coins) | One coin per stream | Filterable |
| Details pro Bestellung | User, oid, side, px, sz | Benutzer, OID, Trigger, Zeitstempel, TIF | Benutzer, OID, Größe |
| Am besten geeignet für | Per-order book tracking without JSON parsing | Full order detail (triggers, tif, cloid) | Kunden, die lediglich Buchaktualisierungen benötigen |
Wichtige Hinweise
- Reset on every
snapshot: trueNachricht: The first message is a full reset with all resting orders asNEWdiffs, and replacement resets can arrive mid-stream (for example after an ALO priority fee queue insertion). Clear any local state and rebuild wheneverMomentaufnahmeis true, not only on subscribe and reconnect REMOVEomitssz: Remove diffs identify the order byoid(withMünze,Benutzer,Seite,px) but carry no size. Delete the order from your local map- Typed alternative to StreamL4Book: If you need trigger info, timestamps,
tif, oderKloidper order, useStreamL4Book; if you need lean typed per-order movement, use this stream - zstd compression recommended: Enable zstd compression on your gRPC channel to reduce bandwidth, especially when streaming multiple coins
Verwandte Streams
- StreamL4Book - Full order book at order granularity with snapshot + JSON-encoded diffs
- StreamL2BookDiff - Incremental L2 price-level changes with sequence numbers
- Aufträge - Ereignisse im Auftragslebenszyklus (eröffnet, ausgeführt, storniert usw.)