Skip to content

weeaa/goyser

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

55 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Solana Geyser SDK

GoDoc Go Report Card License

This library contains tooling to interact with Yellowstone & Jito Geyser plugins.

yellowstone

❇️ Contents

πŸ›Ÿ Support

If my work has been useful in building your for-profit services/infra/bots/etc, consider donating at EcrHvqa5Vh4NhR3bitRZVrdcUGr1Z3o6bXHz7xgBU2FB (SOL).

πŸ“‘ Methods

  • Yellowstone βœ…
    • SubscribeAccounts
      • AppendAccounts
      • UnsubscribeAccounts
      • UnsubscribeAccountsByFilterName
      • UnsubscribeAllAccounts
    • SubscribeSlots
      • UnsubscribeSlots
    • SubscribeTransaction
      • UnsubscribeTransaction
    • SubscribeTransactionStatus
      • UnsubscribeTransactionStatus
    • SubscribeBlocks
      • UnsubscribeBlocks
    • SubscribeBlocksMeta
      • UnsubscribeBlocksMeta
    • SubscribeEntry
      • UnsubscribeEntry
    • SubscribeAccountDataSlice
      • UnsubscribeAccountDataSlice
  • Jito (TBD)

πŸ’‘ It also contains a 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"
  geyser_pb "github.com/weeaa/goyser/yellowstone_geyser/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", geyser_pb.CommitmentLevel_CONFIRMED); 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)
  }
}

πŸ“ƒ License

Apache-2.0 License.