StreamData gRPC Method
Parameters
request
stream<SubscribeRequest>
Loading...
Returns
stream
stream<SubscribeUpdate>
Loading...
data
StreamResponse
Loading...
pong
Pong
Loading...
Request
1package main23import (4"context"5"crypto/tls"6"encoding/json"7"fmt"8"io"9"log"10"time"1112"google.golang.org/grpc"13"google.golang.org/grpc/credentials"14"google.golang.org/grpc/metadata"1516pb "hyperliquid-grpc-go/pb"17)1819const (20// Using Quicknode endpoint21grpcEndpoint = "your-grpc-endpoint:port"22authToken = "your-auth-token"23)2425// Create gRPC connection with TLS26func createConnection() (*grpc.ClientConn, error) {27tlsConfig := &tls.Config{28InsecureSkipVerify: false, // Set to true only for testing29}30creds := credentials.NewTLS(tlsConfig)3132conn, err := grpc.Dial(33grpcEndpoint,34grpc.WithTransportCredentials(creds),35grpc.WithDefaultCallOptions(36grpc.MaxCallRecvMsgSize(100*1024*1024), // 100MB37),38)3940return conn, err41}4243// Create context with auth metadata44func createContext() context.Context {45md := metadata.Pairs("x-token", authToken)46return metadata.NewOutgoingContext(context.Background(), md)47}484950// Stream trades51func streamTrades(client pb.StreamingClient) error {52ctx := createContext()5354stream, err := client.StreamData(ctx)55if err != nil {56return fmt.Errorf("failed to create stream: %v", err)57}5859// Send subscription request60err = stream.Send(&pb.SubscribeRequest{61Request: &pb.SubscribeRequest_Subscribe{62Subscribe: &pb.StreamSubscribe{63StreamType: pb.StreamType_TRADES,64StartBlock: 0,65UserAddresses: []string{},66Coins: []string{},67},68},69})70if err != nil {71return fmt.Errorf("failed to subscribe: %v", err)72}7374// Start ping goroutine75go func() {76ticker := time.NewTicker(30 * time.Second)77defer ticker.Stop()7879for range ticker.C {80err := stream.Send(&pb.SubscribeRequest{81Request: &pb.SubscribeRequest_Ping{82Ping: &pb.Ping{83Timestamp: time.Now().UnixMilli(),84},85},86})87if err != nil {88log.Printf("Failed to send ping: %v", err)89return90}91}92}()9394// Receive messages95log.Println("š Starting trades stream...")96for {97msg, err := stream.Recv()98if err == io.EOF {99log.Println("Stream ended")100break101}102if err != nil {103return fmt.Errorf("receive error: %v", err)104}105106switch update := msg.Update.(type) {107case *pb.SubscribeUpdate_Data:108var data map[string]interface{}109if err := json.Unmarshal([]byte(update.Data.Data), &data); err != nil {110log.Printf("ā ļø Failed to parse data: %v", err)111continue112}113114trades, ok := data["trades"].([]interface{})115tradesCount := 0116if ok {117tradesCount = len(trades)118}119120log.Printf("š Block %d: %d trades", update.Data.BlockNumber, tradesCount)121122// Pretty print first trade if available123if tradesCount > 0 {124firstTrade := trades[0]125tradeJSON, _ := json.MarshalIndent(firstTrade, " ", " ")126fmt.Printf(" Example trade:\n%s\n", tradeJSON)127}128129case *pb.SubscribeUpdate_Pong:130log.Printf("š Pong received: %d", update.Pong.Timestamp)131}132}133134return nil135}136137// Stream filtered trades138func streamFilteredTrades(client pb.StreamingClient, coins []string) error {139ctx := createContext()140141stream, err := client.StreamData(ctx)142if err != nil {143return fmt.Errorf("failed to create stream: %v", err)144}145146// Send filtered subscription147err = stream.Send(&pb.SubscribeRequest{148Request: &pb.SubscribeRequest_Subscribe{149Subscribe: &pb.StreamSubscribe{150StreamType: pb.StreamType_TRADES,151StartBlock: 0,152UserAddresses: []string{},153Coins: coins,154},155},156})157if err != nil {158return fmt.Errorf("failed to subscribe: %v", err)159}160161log.Printf("š Starting filtered trades stream for coins: %v", coins)162163// Receive messages164for {165msg, err := stream.Recv()166if err == io.EOF {167log.Println("Filtered stream ended")168break169}170if err != nil {171return fmt.Errorf("receive error: %v", err)172}173174switch update := msg.Update.(type) {175case *pb.SubscribeUpdate_Data:176var data map[string]interface{}177if err := json.Unmarshal([]byte(update.Data.Data), &data); err != nil {178log.Printf("ā ļø Failed to parse data: %v", err)179continue180}181182if trades, ok := data["trades"].([]interface{}); ok && len(trades) > 0 {183log.Printf("š Filtered Block %d: %d trades", update.Data.BlockNumber, len(trades))184prettyJSON, _ := json.MarshalIndent(data, "", " ")185fmt.Println(string(prettyJSON))186}187}188}189190return nil191}192193// Stream orders194func streamOrders(client pb.StreamingClient) error {195ctx := createContext()196197stream, err := client.StreamData(ctx)198if err != nil {199return fmt.Errorf("failed to create stream: %v", err)200}201202// Send subscription request for orders203err = stream.Send(&pb.SubscribeRequest{204Request: &pb.SubscribeRequest_Subscribe{205Subscribe: &pb.StreamSubscribe{206StreamType: pb.StreamType_ORDERS,207StartBlock: 0,208UserAddresses: []string{},209Coins: []string{},210},211},212})213if err != nil {214return fmt.Errorf("failed to subscribe: %v", err)215}216217log.Println("š Starting orders stream...")218219// Receive messages220for {221msg, err := stream.Recv()222if err == io.EOF {223log.Println("Orders stream ended")224break225}226if err != nil {227return fmt.Errorf("receive error: %v", err)228}229230switch update := msg.Update.(type) {231case *pb.SubscribeUpdate_Data:232var data map[string]interface{}233if err := json.Unmarshal([]byte(update.Data.Data), &data); err != nil {234log.Printf("ā ļø Failed to parse order data: %v", err)235continue236}237238log.Printf("š Orders Block %d:", update.Data.BlockNumber)239prettyJSON, _ := json.MarshalIndent(data, "", " ")240fmt.Println(string(prettyJSON))241}242}243244return nil245}246247248// Interactive menu249func runInteractiveMenu(conn *grpc.ClientConn) {250client := pb.NewStreamingClient(conn)251252fmt.Println("\nš Connected successfully!")253fmt.Println("\nAvailable streams:")254fmt.Println("1. All trades")255fmt.Println("2. Filtered trades (BTC, ETH)")256fmt.Println("3. Orders")257fmt.Println("4. Exit")258259for {260fmt.Print("\nSelect stream (1-4): ")261var choice string262fmt.Scanln(&choice)263264switch choice {265case "1":266if err := streamTrades(client); err != nil {267log.Printf("ā Stream error: %v", err)268}269case "2":270if err := streamFilteredTrades(client, []string{"BTC", "ETH"}); err != nil {271log.Printf("ā Filtered stream error: %v", err)272}273case "3":274if err := streamOrders(client); err != nil {275log.Printf("ā Orders stream error: %v", err)276}277case "4":278fmt.Println("š Goodbye!")279return280default:281fmt.Println("ā Invalid choice. Please select 1-4.")282}283}284}285286func main() {287// Create connection288conn, err := createConnection()289if err != nil {290log.Fatalf("ā Failed to connect: %v", err)291}292defer conn.Close()293294fmt.Printf("Connected to: %s\n", grpcEndpoint)295296// Run interactive menu297runInteractiveMenu(conn)298}
1package main23import (4"context"5"crypto/tls"6"encoding/json"7"fmt"8"io"9"log"10"time"1112"google.golang.org/grpc"13"google.golang.org/grpc/credentials"14"google.golang.org/grpc/metadata"1516pb "hyperliquid-grpc-go/pb"17)1819const (20// Using Quicknode endpoint21grpcEndpoint = "your-grpc-endpoint:port"22authToken = "your-auth-token"23)2425// Create gRPC connection with TLS26func createConnection() (*grpc.ClientConn, error) {27tlsConfig := &tls.Config{28InsecureSkipVerify: false, // Set to true only for testing29}30creds := credentials.NewTLS(tlsConfig)3132conn, err := grpc.Dial(33grpcEndpoint,34grpc.WithTransportCredentials(creds),35grpc.WithDefaultCallOptions(36grpc.MaxCallRecvMsgSize(100*1024*1024), // 100MB37),38)3940return conn, err41}4243// Create context with auth metadata44func createContext() context.Context {45md := metadata.Pairs("x-token", authToken)46return metadata.NewOutgoingContext(context.Background(), md)47}484950// Stream trades51func streamTrades(client pb.StreamingClient) error {52ctx := createContext()5354stream, err := client.StreamData(ctx)55if err != nil {56return fmt.Errorf("failed to create stream: %v", err)57}5859// Send subscription request60err = stream.Send(&pb.SubscribeRequest{61Request: &pb.SubscribeRequest_Subscribe{62Subscribe: &pb.StreamSubscribe{63StreamType: pb.StreamType_TRADES,64StartBlock: 0,65UserAddresses: []string{},66Coins: []string{},67},68},69})70if err != nil {71return fmt.Errorf("failed to subscribe: %v", err)72}7374// Start ping goroutine75go func() {76ticker := time.NewTicker(30 * time.Second)77defer ticker.Stop()7879for range ticker.C {80err := stream.Send(&pb.SubscribeRequest{81Request: &pb.SubscribeRequest_Ping{82Ping: &pb.Ping{83Timestamp: time.Now().UnixMilli(),84},85},86})87if err != nil {88log.Printf("Failed to send ping: %v", err)89return90}91}92}()9394// Receive messages95log.Println("š Starting trades stream...")96for {97msg, err := stream.Recv()98if err == io.EOF {99log.Println("Stream ended")100break101}102if err != nil {103return fmt.Errorf("receive error: %v", err)104}105106switch update := msg.Update.(type) {107case *pb.SubscribeUpdate_Data:108var data map[string]interface{}109if err := json.Unmarshal([]byte(update.Data.Data), &data); err != nil {110log.Printf("ā ļø Failed to parse data: %v", err)111continue112}113114trades, ok := data["trades"].([]interface{})115tradesCount := 0116if ok {117tradesCount = len(trades)118}119120log.Printf("š Block %d: %d trades", update.Data.BlockNumber, tradesCount)121122// Pretty print first trade if available123if tradesCount > 0 {124firstTrade := trades[0]125tradeJSON, _ := json.MarshalIndent(firstTrade, " ", " ")126fmt.Printf(" Example trade:\n%s\n", tradeJSON)127}128129case *pb.SubscribeUpdate_Pong:130log.Printf("š Pong received: %d", update.Pong.Timestamp)131}132}133134return nil135}136137// Stream filtered trades138func streamFilteredTrades(client pb.StreamingClient, coins []string) error {139ctx := createContext()140141stream, err := client.StreamData(ctx)142if err != nil {143return fmt.Errorf("failed to create stream: %v", err)144}145146// Send filtered subscription147err = stream.Send(&pb.SubscribeRequest{148Request: &pb.SubscribeRequest_Subscribe{149Subscribe: &pb.StreamSubscribe{150StreamType: pb.StreamType_TRADES,151StartBlock: 0,152UserAddresses: []string{},153Coins: coins,154},155},156})157if err != nil {158return fmt.Errorf("failed to subscribe: %v", err)159}160161log.Printf("š Starting filtered trades stream for coins: %v", coins)162163// Receive messages164for {165msg, err := stream.Recv()166if err == io.EOF {167log.Println("Filtered stream ended")168break169}170if err != nil {171return fmt.Errorf("receive error: %v", err)172}173174switch update := msg.Update.(type) {175case *pb.SubscribeUpdate_Data:176var data map[string]interface{}177if err := json.Unmarshal([]byte(update.Data.Data), &data); err != nil {178log.Printf("ā ļø Failed to parse data: %v", err)179continue180}181182if trades, ok := data["trades"].([]interface{}); ok && len(trades) > 0 {183log.Printf("š Filtered Block %d: %d trades", update.Data.BlockNumber, len(trades))184prettyJSON, _ := json.MarshalIndent(data, "", " ")185fmt.Println(string(prettyJSON))186}187}188}189190return nil191}192193// Stream orders194func streamOrders(client pb.StreamingClient) error {195ctx := createContext()196197stream, err := client.StreamData(ctx)198if err != nil {199return fmt.Errorf("failed to create stream: %v", err)200}201202// Send subscription request for orders203err = stream.Send(&pb.SubscribeRequest{204Request: &pb.SubscribeRequest_Subscribe{205Subscribe: &pb.StreamSubscribe{206StreamType: pb.StreamType_ORDERS,207StartBlock: 0,208UserAddresses: []string{},209Coins: []string{},210},211},212})213if err != nil {214return fmt.Errorf("failed to subscribe: %v", err)215}216217log.Println("š Starting orders stream...")218219// Receive messages220for {221msg, err := stream.Recv()222if err == io.EOF {223log.Println("Orders stream ended")224break225}226if err != nil {227return fmt.Errorf("receive error: %v", err)228}229230switch update := msg.Update.(type) {231case *pb.SubscribeUpdate_Data:232var data map[string]interface{}233if err := json.Unmarshal([]byte(update.Data.Data), &data); err != nil {234log.Printf("ā ļø Failed to parse order data: %v", err)235continue236}237238log.Printf("š Orders Block %d:", update.Data.BlockNumber)239prettyJSON, _ := json.MarshalIndent(data, "", " ")240fmt.Println(string(prettyJSON))241}242}243244return nil245}246247248// Interactive menu249func runInteractiveMenu(conn *grpc.ClientConn) {250client := pb.NewStreamingClient(conn)251252fmt.Println("\nš Connected successfully!")253fmt.Println("\nAvailable streams:")254fmt.Println("1. All trades")255fmt.Println("2. Filtered trades (BTC, ETH)")256fmt.Println("3. Orders")257fmt.Println("4. Exit")258259for {260fmt.Print("\nSelect stream (1-4): ")261var choice string262fmt.Scanln(&choice)263264switch choice {265case "1":266if err := streamTrades(client); err != nil {267log.Printf("ā Stream error: %v", err)268}269case "2":270if err := streamFilteredTrades(client, []string{"BTC", "ETH"}); err != nil {271log.Printf("ā Filtered stream error: %v", err)272}273case "3":274if err := streamOrders(client); err != nil {275log.Printf("ā Orders stream error: %v", err)276}277case "4":278fmt.Println("š Goodbye!")279return280default:281fmt.Println("ā Invalid choice. Please select 1-4.")282}283}284}285286func main() {287// Create connection288conn, err := createConnection()289if err != nil {290log.Fatalf("ā Failed to connect: %v", err)291}292defer conn.Close()293294fmt.Printf("Connected to: %s\n", grpcEndpoint)295296// Run interactive menu297runInteractiveMenu(conn)298}
Don't have an account yet?
Create your Quicknode endpoint in seconds and start building
Get started for free