syntax = "proto3";

package hyperliquid_l1_gateway.v2;
option go_package = "internal/api/v2";

service HyperliquidL1Gateway {
  // Start a blocks stream from the given Position
  rpc StreamBlocks(Position) returns (stream Block) {}

  // Start a fills stream from the given Position
  rpc StreamFills(Position) returns (stream BlockFills) {}

  // Start an order book snapshots stream from the given Position
  rpc StreamOrderbookSnapshots(Position)
      returns (stream OrderBookSnapshot) {}

  // Start a raw book diffs stream from the given Position
  rpc StreamRawBookDiffs(Position) returns (stream BlockRawBookDiffs) {}

  // Start an order statuses stream from the given Position
  rpc StreamOrderStatuses(Position) returns (stream BlockOrderStatuses) {}

  // Start a miscellaneous events stream from the given Position
  rpc StreamMiscEvents(Position) returns (stream BlockMiscEvents) {}

  // Start a TWAP statuses stream from the given Position
  rpc StreamTwapStatuses(Position) returns (stream BlockTwapStatuses) {}

  // Return a single block at the requested Position
  rpc GetBlock(Position) returns (Block) {}

  // Return fills at the requested Position
  rpc GetFills(Position) returns (BlockFills) {}

  // Return an order book snapshot at the requested Timestamp
  rpc GetOrderBookSnapshot(Timestamp) returns (OrderBookSnapshot) {}

  // Return raw book diffs at the requested Position
  rpc GetRawBookDiffs(Position) returns (BlockRawBookDiffs) {}

  // Return order statuses at the requested Position
  rpc GetOrderStatuses(Position) returns (BlockOrderStatuses) {}

  // Return miscellaneous events at the requested Position
  rpc GetMiscEvents(Position) returns (BlockMiscEvents) {}

  // Return TWAP statuses at the requested Position
  rpc GetTwapStatuses(Position) returns (BlockTwapStatuses) {}
}

message Position {
  // Leave all fields unset or zero to target the latest data.
  oneof position {
    int64 timestamp_ms = 1; // ms since Unix epoch, inclusive
    int64 block_height = 2; // block height, inclusive
  }
}

message Timestamp {
  int64 timestamp_ms = 1;
}

message Block {
  // JSON-encoded Hyperliquid block from "replica_cmds".
  bytes data = 1;
}

message OrderBookSnapshot {
  // JSON-encoded Hyperliquid order book snapshot.
  bytes data = 1;
}

message BlockFills {
  // JSON-encoded object from "node_fills" or "node_fills_by_block".
  bytes data = 1;
}

message BlockRawBookDiffs {
  // JSON-encoded object from "node_raw_book_diffs_by_block".
  bytes data = 1;
}

message BlockOrderStatuses {
  // JSON-encoded object from "node_order_statuses_by_block".
  bytes data = 1;
}

message BlockMiscEvents {
  // JSON-encoded block envelope from "misc_events_by_block".
  bytes data = 1;
}

message BlockTwapStatuses {
  // JSON-encoded block envelope from "node_twap_statuses_by_block".
  bytes data = 1;
}
