# Flashblocks

`GetBdnFlashBlockStream` feed provides low-latency access to newly produced **Flashblocks** on the Base network. Flashblocks are pre-confirmation blocks available before they are finalized on-chain and may differ from the final canonical chain. This is a real-time WS/gRPC, raw Flashblocks data stream.

**Service available via Cloud API only.**

## Stream Endpoint

* Method: `GetBdnFlashBlockStream`&#x20;
* Endpoint: `wss://base.blxrbdn.com:5005/ws`

## Examples

{% tabs %}
{% tab title="WebSocket" %}

```shellscript
wscat -H "Authorization: <AUTH_HEADER>" \
  -c wss://base.blxrbdn.com:5005/ws \
  --wait 1000 \
  --execute '{"jsonrpc": "2.0", "id": 1, "method": "subscribe", "params": [  "GetBdnFlashBlockStream", {} ]}'
```

{% endtab %}

{% tab title="gRPC" %}

```shellscript
grpcurl -H "Authorization: <AUTH_HEADER>" \
  -H "Content-Type: application/grpc" \
  -d '{}' \
  base.blxrbdn.com:443 \
  streamerapi.Api/GetBdnFlashBlockStream
```

{% endtab %}

{% tab title="Golang" %}

```go
package main

import (
	"encoding/json"
	"net/http"
	"net/url"

	"github.com/gorilla/websocket"
	"github.com/rs/zerolog/log"
)

const (
	BxAuthHeader = "PUT_YOUR_AUTH_HEADER"
)

type Result struct {
	BdnFlashBlock []byte `json:"bdnFlashBlock"`
}

type Params struct {
	Subscription string `json:"subscription"`
	Result       Result `json:"result"`
}

type Response struct {
	JsonRPC string `json:"jsonrpc"`
	Method  string `json:"method"`
	Params  Params `json:"params"`
}

func main() {
	u, err := url.Parse("wss://base.blxrbdn.com:5005/ws")
	if err != nil {
		log.Fatal().Err(err).Msg("Invalid WebSocket URL: ")
	}

	log.Info().Str("url", u.String()).Msg("Connecting...")
	conn, _, err := websocket.DefaultDialer.Dial(u.String(), http.Header{
		"Authorization": []string{BxAuthHeader},
	})
	if err != nil {
		log.Fatal().Err(err).Msg("WebSocket connection failed: ")
	}
	defer conn.Close()

	request := []byte(`{"jsonrpc": "2.0", "id": 1, "method": "subscribe", "params": [ "GetBdnFlashBlockStream", {} ]}`)
	err = conn.WriteMessage(websocket.TextMessage, request)
	if err != nil {
		log.Fatal().Err(err).Msg("Error sending message: ")
	}

	log.Info().Msg("Connected! Listening for Flashblocks...")
	for {
		msgType, msg, err := conn.ReadMessage()
		if err != nil {
			log.Error().Err(err).Msg("Read error: ")
			continue
		}

		if msgType != websocket.TextMessage {
			log.Error().Err(err).Int("msgType", msgType).Msg("Skipping non-text message: ")
			continue
		}

		var response *Response
		err = json.Unmarshal(msg, &response)
		if err != nil {
			log.Error().Err(err).Msg("Failed to unmarshal response: ")
			continue
		}

		if response.Params.Result.BdnFlashBlock == nil { // Expected for the first update
			log.Warn().Msg("BdnFlashBlock is nil")
			continue
		}

		// Use the Brotli-compressed Flashblock...
		log.Info().Msg("Got Flashblock")
	}
}
```

{% endtab %}
{% endtabs %}

## Response<br>

{% tabs %}
{% tab title="WebSocket" %}

```json
{"jsonrpc":"2.0",
"method":"subscribe",
"params":{"subscription":"43dcfff5-e67a-44ee-9284-85b8add00db5",
"result":{"bdnFlashBlock":
"G80JAGS//cKU/7oQmkmm+sABKdoXLMEWDuf/cIHFCaYxxX+09qS5KYt7YZTNcQv3dDrAs7lEL8uy51xSKyicwKfZk/x7vfO/X731uj2v68kFfwGTEOucxaeO1PXgUuq6nsCDS6foejIPEppzcyX7ppp1sy6SEljbItbg96xWK6Q5pixrRtHs5MTdqRN8CpJ5F6ZIDYm3a0RfD3RAgiGxH86op3NNklpN+wo9JJ5q4pO0EmR7ctHU1LIlZ5oMfDb6kbObfbpv9EAflsSPwjoR4prmfOjPtw/+pvxt+/BM27V6h4nFbENOXkDSp2M0B1FFFGKsGhjlmGocYuAS3S0NGw67BMkNIZ08slzzU7/f6IbG1uFeDpFwPbiONXqT7WOnZw+iGvv2UBL2IwfXL9XaSPnek6lNTCD0J+tmmch3/eH21O8KoaVT9/X/g6uez7i77/7RP7aDWwkdwIgPnf383ce74HtbmuQhwYhdpCtnNSEHTaSnSZNqDTUSwcyWKSJm0Ek9vdyRp6ZXb5/eydj9t6+X+q/XUU8SDI2IE/YQ84NHDy2fnbG2YUFvLRMlsJ1GSB3Bmcyc2yTwHNfIo80miBmu6bXpcA/lc+ofbhnv15Pf8G7acwBhO3Rr4Skg4mkXBUJyOodWKibRxjjCUbhXI+ECdRZijtcyh2N+JCcV9AvQCzwS0K6yDAyMYYQEDMKCuGJHU4BoVQMRMFEmgVHokXdcGxtAlVO1X5SUBBLJf0RurIg7omR2lEaKVQoN01GzaOG9VQ7FWlX7jPNU1SrxEhuicSltGxcsmH38qO0BQ8w4xDLoOkIRktUrdNcHXYjF9ceDK2/DEkjkr8iS5WJ6OHzHZRxFrovZaRbx6SViC7ZZHwVHsmj03XpMDdg5ZvrggUagid4ZtxPAgqCOnsLEWaLavwnoiOChAwwPrjf95VYjcG+VB+s+BwfVS80BIx3MxY6QoQ7EvAJ1MWWsdHjp5DyYdtnhml3KZKA9yHgmNCzCFlFBDdEOhKIwOR1FOSYIs/fhnYFRNu6GoeUjvFFTDEs8OEMfVapEgbX3AVNvj9AwTubKq1KCYCtpCANNWSH4HoOH/nt91e/e3tN3"}}}
```

{% endtab %}

{% tab title="gRPC" %}

```json
{ "bdnFlashBlock": "WVCW1+V6OGXv/0L+w+ickZvRrMKzE1NUDdvBRxevyB...3BKCRABRU1Y4EysRyIGjPY5eTZ4d5uQru8Q3qvAK1SmMien55fDvx5uyjfABjVN4aB5DAZOgRR8pDavcaQdL9PUKqpdmnbsazrg8EWcDpo3YX3xT72la4utinAReKcisqyavBoch5BNsXW4GqrVXVe/MuC7dSV5lXUfUxZMUkbrb4AzchfduxySob/vNTjEGKSA65JssTj+nzCs6jK9IX30XiMtsSCnTA37ckSS+qp6OvZVTdn0M3xndRAay/PCeh3Qjqa7pgHHZHZkO9YOSVpS8CUz6s+Vq6kHcjrSGxwEy9LNOtVR6kgIJnIjZC1eoFR5w4O8yg8vruKQgjyWVqZ6Eh+l66TLrl0QJoULd7s2b2qxr4iY8QwGO5O10CfPVGTtws6HWek7w59HxmlAk3B8NVsHDRKB2RJWeojW54EAqSZJP....3....B"}
```

{% endtab %}
{% endtabs %}
