🐳 Solana Geyser Go SDK
Solana Geyser SDK
This library contains tooling to interact with Yellowstone & Jito Geyser plugins.
❇️ Contents
- Subscribe to Account🛟 Support
If my work has been useful in building your for-profit services/infra/bots/etc, consider donating atEcrHvqa5Vh4NhR3bitRZVrdcUGr1Z3o6bXHz7xgBU2FB (SOL).
📡 Methods
- Yellowstone ✅
SubscribeAccounts
- AppendAccounts
- UnsubscribeAccounts
- UnsubscribeAccountsByFilterName
- UnsubscribeAllAccounts
- SubscribeSlots
- UnsubscribeSlots
- SubscribeTransaction
- UnsubscribeTransaction
- SubscribeTransactionStatus
- UnsubscribeTransactionStatus
- SubscribeBlocks
- UnsubscribeBlocks
- SubscribeBlocksMeta
- UnsubscribeBlocksMeta
- SubscribeEntry
- UnsubscribeEntry
- SubscribeAccountDataSlice
- UnsubscribeAccountDataSlice
- Jito (TBD)
ConvertTransaction function which converts from Goyser to github.com/gagliardetto/solana-go types :)
💾 Installing
Go 1.22.0 or higher.
go get github.com/weeaa/goyser@latest
💻 Examples
Subscribe to Account – Yellowstone
Simple example on how to monitor an account for transactions with explanations.
package main
import ( "context" "github.com/weeaa/goyser/yellowstone_geyser" geyserpb "github.com/weeaa/goyser/yellowstonegeyser/pb" "log" "os" "time" )
const subAccount = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"
func main() { ctx := context.Background()
// get the geyser rpc address geyserRPC := os.Getenv("GEYSER_RPC")
// create geyser client client, err := yellowstone_geyser.New(ctx, geyserRPC, nil) if err != nil { log.Fatal(err) }
// create a new subscribe client which is tied, for our example we will name it main // the created client is stored in client.Streams if err = client.AddStreamClient(ctx, "main", geyserpb.CommitmentLevelCONFIRMED); err != nil { log.Fatal(err) }
// get the stream client streamClient := client.GetStreamClient("main") if streamClient == nil { log.Fatal("client does not have a stream named main") }
// subscribe to the account you want to see txns from and set a custom filter name to filter them out later if err = streamClient.SubscribeAccounts("accounts", &geyser_pb.SubscribeRequestFilterAccounts{ Account: []string{subAccount}, }); err != nil { log.Fatal(err) }
// loop through the stream and print the output for out := range streamClient.Ch { // u can filter the output by checking the filters go func() { filters := out.GetFilters() for _, filter := range filters { switch filter { case "accounts": log.Printf("account filter: %+v", out.GetAccount()) default: log.Printf("unknown filter: %s", filter) } } }() break }
time.Sleep(5 * time.Second)
// unsubscribe from the account if err = streamClient.UnsubscribeAccounts("accounts", subAccount); err != nil { log.Fatal(err) } }