blocto / solana-go-sdk

Solana Golang SDK
https://blocto.github.io/solana-go-sdk/
MIT License
410 stars 109 forks source link
blockchain go golang sdk solana

Solana Go SDK

GitHub go.mod Go version GitHub release (latest SemVer)

Guide

Getting Started

Installing

go get -v github.com/blocto/solana-go-sdk

Example

Hello World

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/blocto/solana-go-sdk/client"
    "github.com/blocto/solana-go-sdk/rpc"
)

func main() {
    c := client.NewClient(rpc.MainnetRPCEndpoint)

    // If you would like to customize the http client used to make the
    // requests you could do something like this
    // c := client.New(rpc.WithEndpoint(rpc.MainnetRPCEndpoint),rpc.WithHTTPClient(customHTTPClient))

    resp, err := c.GetVersion(context.TODO())
    if err != nil {
        log.Fatalf("failed to version info, err: %v", err)
    }

    fmt.Println("version", resp.SolanaCore)
}

RPC

All interfaces of rpc follow the solana's json-rpc docs.

The implementation of client in this project separate into two parts, rpc and wrapped. The wrapped only returns main result value and the rpc returns whole rpc response. You can switch it by yourself for different situation. Take getBalance as example:

package main

import (
    "context"
    "fmt"
    "log"

    "github.com/blocto/solana-go-sdk/client"
    "github.com/blocto/solana-go-sdk/rpc"
)

func main() {
    c := client.NewClient(rpc.DevnetRPCEndpoint)

    // get balance
    balance, err := c.GetBalance(
        context.TODO(),
        "RNfp4xTbBb4C3kcv2KqtAj8mu4YhMHxqm1Skg9uchZ7",
    )
    if err != nil {
        log.Fatalf("failed to get balance, err: %v", err)
    }
    fmt.Printf("balance: %v\n", balance)

    // get balance with sepcific commitment
    balance, err = c.GetBalanceWithConfig(
        context.TODO(),
        "RNfp4xTbBb4C3kcv2KqtAj8mu4YhMHxqm1Skg9uchZ7",
        rpc.GetBalanceConfig{
            Commitment: rpc.CommitmentProcessed,
        },
    )
    if err != nil {
        log.Fatalf("failed to get balance with cfg, err: %v", err)
    }
    fmt.Printf("balance: %v\n", balance)

    // for advanced usage. fetch full rpc response
    res, err := c.RpcClient.GetBalance(
        context.TODO(),
        "RNfp4xTbBb4C3kcv2KqtAj8mu4YhMHxqm1Skg9uchZ7",
    )
    if err != nil {
        log.Fatalf("failed to get balance via rpc client, err: %v", err)
    }
    fmt.Printf("response: %+v\n", res)
}

Programing model & Program

There are some important tpyes in solana.

resides in the program/ folder.

resides in the common/ folder.

reside in the types/ folder.

More Example

for more examples, follow examples/ folder