Skip to main content

StreamBlocks gRPC Method

Loading...

Updated on
Jan 07, 2026

StreamBlocks gRPC Method

Parameters

timestamp
integer
Loading...

Returns

stream
object
Loading...
Request
1
package main
2
3
import (
4
"context"
5
"crypto/tls"
6
"encoding/json"
7
"fmt"
8
"io"
9
"log"
10
"time"
11
12
"google.golang.org/grpc"
13
"google.golang.org/grpc/credentials"
14
"google.golang.org/grpc/metadata"
15
16
pb "hyperliquid-grpc-go/pb"
17
)
18
19
const (
20
// Using Quicknode endpoint
21
grpcEndpoint = "your-grpc-endpoint:port"
22
authToken = "your-auth-token"
23
)
24
25
// Create gRPC connection with TLS
26
func createConnection() (*grpc.ClientConn, error) {
27
tlsConfig := &tls.Config{
28
InsecureSkipVerify: false, // Set to true only for testing
29
}
30
creds := credentials.NewTLS(tlsConfig)
31
32
conn, err := grpc.Dial(
33
grpcEndpoint,
34
grpc.WithTransportCredentials(creds),
35
grpc.WithDefaultCallOptions(
36
grpc.MaxCallRecvMsgSize(100*1024*1024), // 100MB
37
),
38
)
39
40
return conn, err
41
}
42
43
// Create context with auth metadata
44
func createContext() context.Context {
45
md := metadata.Pairs("x-token", authToken)
46
return metadata.NewOutgoingContext(context.Background(), md)
47
}
48
49
50
// Stream blocks
51
func streamBlocks(client pb.BlockStreamingClient) error {
52
ctx := createContext()
53
54
stream, err := client.StreamBlocks(ctx, &pb.Timestamp{
55
Timestamp: time.Now().UnixMilli(),
56
})
57
if err != nil {
58
return fmt.Errorf("failed to stream blocks: %v", err)
59
}
60
61
log.Println("šŸ”„ Starting blocks stream...")
62
63
for {
64
block, err := stream.Recv()
65
if err == io.EOF {
66
log.Println("Block stream ended")
67
break
68
}
69
if err != nil {
70
return fmt.Errorf("receive error: %v", err)
71
}
72
73
var blockData map[string]interface{}
74
if err := json.Unmarshal([]byte(block.DataJson), &blockData); err != nil {
75
log.Printf("āš ļø Failed to parse block: %v", err)
76
continue
77
}
78
79
if abciBlock, ok := blockData["abci_block"].(map[string]interface{}); ok {
80
if round, ok := abciBlock["round"].(float64); ok {
81
log.Printf("🧱 Received block round: %.0f", round)
82
}
83
}
84
}
85
86
return nil
87
}
88
89
90
// Interactive menu
91
func runInteractiveMenu(conn *grpc.ClientConn) {
92
blockClient := pb.NewBlockStreamingClient(conn)
93
94
fmt.Println("\nšŸŽ‰ Connected successfully!")
95
fmt.Println("\nAvailable stream:")
96
fmt.Println("1. Stream blocks")
97
fmt.Println("2. Exit")
98
99
for {
100
fmt.Print("\nSelect option (1-2): ")
101
var choice string
102
fmt.Scanln(&choice)
103
104
switch choice {
105
case "1":
106
if err := streamBlocks(blockClient); err != nil {
107
log.Printf("āŒ Block stream error: %v", err)
108
}
109
case "2":
110
fmt.Println("šŸ‘‹ Goodbye!")
111
return
112
default:
113
fmt.Println("āŒ Invalid choice. Please select 1-2.")
114
}
115
}
116
}
117
118
func main() {
119
// Create connection
120
conn, err := createConnection()
121
if err != nil {
122
log.Fatalf("āŒ Failed to connect: %v", err)
123
}
124
defer conn.Close()
125
126
fmt.Printf("Connected to: %s\n", grpcEndpoint)
127
128
// Run interactive menu
129
runInteractiveMenu(conn)
130
}
Don't have an account yet?
Create your Quicknode endpoint in seconds and start building
Get started for free